比赛 2025.5.4 评测结果 EEEEEEEEEE
题目名称 数列操作η 最终得分 0
用户昵称 李奇文 运行时间 2.279 s
代码语言 C++ 内存使用 3.61 MiB
提交时间 2025-05-04 11:59:54
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,q,b[N];
struct tree{
	int lz,l,r,ans,bw; 
}f[N*4];
void push(int p){
	f[p].ans=f[p<<1].ans+f[p<<1|1].ans;
	return;
}
void pushup(int p){
	f[p].bw=min(f[p<<1].bw,f[p<<1|1].bw);
	return;
}
void pushdown(int p){
	f[p<<1].lz+=f[p].lz;
	f[p<<1|1].lz+=f[p].lz;
	f[p<<1].bw+=f[p].lz;
	f[p<<1|1].bw+=f[p].lz;
	f[p].lz=0;
	return;
}
void build(int p,int l,int r){
	f[p].l=l,f[p].r=r;
	if(l==r){
		f[p].bw=b[l];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,1,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
	return;
}

void update(int p,int l,int r){
	if(l<=f[p].l&&f[p].r<=r&&f[p].bw>1){
		f[p].bw--;
		f[p].lz--;
		return;
	}
	if(f[p].l==f[p].r&&f[p].bw==1){
		f[p].ans++;
		f[p].bw=b[f[p].l];
		return;
	}
	int mid=f[p].l+f[p].r>>1;
	if(f[p].lz) pushdown(p);
	if(mid<l) update(p<<1|1,l,r);
	else if(mid>=r) update(p<<1,l,r);
	else update(p<<1,l,mid),update(p<<1|1,mid+1,r);
	pushup(p);
	push(p);
	return;
}
int query(int p,int l,int r){
	if(l<=f[p].l&&f[p].r<=r) return f[p].ans;
	int mid=f[p].l+f[p].r>>1,sum=0;
	if(l<=mid) sum+=query(p<<1,l,mid);
	if(r>mid) sum+=query(p<<1|1,mid+1,r);
	return sum;
}
int main(){
	freopen("eta.in","r",stdin);
	freopen("eta.out","w",stdout);
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&b[i]);
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		string s;
		int l,r;
		cin>>s;
		scanf("%d%d",&l,&r);
		if(s=="add"){
			update(1,l,r);
		}else{
			printf("%d\n",query(1,l,r));
		}
	}
	return 0;
}