记录编号 600471 评测结果 AAAAAAAAAA
题目名称 数列操作η 最终得分 100
用户昵称 Gravatar健康铀 是否通过 通过
代码语言 C++ 运行时间 3.693 s
提交时间 2025-05-04 17:43:12 内存使用 12.10 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define ls p*2
#define rs p*2+1
using namespace std;
typedef long long ll;
const int N=100010;
ll n,q,a[N];
struct node {
	int l,r;
	ll v,k,t; 
}tr[N*4];
void build (int p,int l,int r) {
	tr[p].l=l;
	tr[p].r=r;
	tr[p].t=0;
	tr[p].k=a[l];
	if (l==r) {
		tr[p].v=0;
		return;
	}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	tr[p].v=tr[ls].v+tr[rs].v;
	tr[p].k=min(tr[ls].k,tr[rs].k);
	//cout << tr[p].k <<endl;
}
void pushdown (int p) {
	if (!tr[p].t) return;
	tr[ls].k-=tr[p].t;
	tr[rs].k-=tr[p].t;
	tr[ls].t+=tr[p].t;
	tr[rs].t+=tr[p].t;
	tr[p].t=0;
}
ll query (int p,int l,int r) {
	if (tr[p].l>=l&&tr[p].r<=r) return tr[p].v;
	int mid=(tr[p].l+tr[p].r)/2;
	double sum=0;
	pushdown(p);
	if (l<=mid) sum+=query(ls,l,r);
	if (r>mid) sum+=query(rs,l,r);
	return sum;
}
void update (int p) {
    if(tr[p].k>0) return;
    if (tr[p].l==tr[p].r) {
        tr[p].v++;
		tr[p].k+=a[tr[p].l];
        return;
    }
    pushdown(p);
    if(tr[ls].k==0) update(ls);
    if(tr[rs].k==0) update(rs);
    tr[p].v=tr[ls].v+tr[rs].v;
	tr[p].k=min(tr[ls].k,tr[rs].k);
    return;
}
void add (int p,int l,int r) {
	if (tr[p].l>=l&&tr[p].r<=r) {
		tr[p].t++;
		tr[p].k--;
		update(p);
		return;
	}
	int mid=(tr[p].l+tr[p].r)/2;
	pushdown(p);
	if (l<=mid) add(ls,l,r);
	if (r>mid) add(rs,l,r);
	tr[p].v=tr[ls].v+tr[rs].v;
	tr[p].k=min(tr[ls].k,tr[rs].k);
}
int main () {
    freopen("eta.in","r",stdin);
	freopen("eta.out","w",stdout);
	cin >> n >> q;
	for (int i=1;i<=n;i++) {
		cin >> a[i];
	}
	build(1,1,n);
	while (q--) {
		string s;
		int l,r;
		cin >> s >> l >> r;
		if (s[0]=='a') {
			add(1,l,r);
		}else{
			cout << (ll)query(1,l,r) <<endl;
		}
	}
	return 0;
}