# re 求助
查看原帖
# re 求助
431892
KamiKirito楼主2021/10/2 19:31
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MAXN 100010
using namespace std;
ll n,m;
ll a[MAXN];
struct edge{
	ll l,r,sum;
}t[MAXN<<2];
inline void pushup(ll j){
	t[j].sum+=(t[j<<1].sum+t[(j<<1)+1].sum);
}
inline void build(ll j,ll left,ll right){
	t[j].l=left;
	t[j].r=right;
	if(left==right){
		t[j].sum=a[left];
		return;
	}
	int mid=(left+right)<<1;
	build(j<<1,left,mid);
	build((j<<1)+1,mid+1,right);
	pushup(j);
}
inline void add(ll j,ll v,ll k){
	if(t[j].l==v&&t[j].r==v){
		t[j].sum+=k;
		return;
	}
	int mid=(t[j].l+t[j].r)<<1;
	add(j<<1,v,k);
	add((j<<1)+1,v,k);
	pushup(j);
}
inline ll query(ll j,ll left,ll right){
	ll s=0;
	if(t[j].l>=left&&t[j].r<=right) return t[j].sum;
	if(t[j].r<=left&&t[j].l>=right) return 0;
	if(t[j<<1].r>=left) return s+=query(j<<1,left,right);
	if(t[(j<<1)+1].l<=right) return s+=query((j<<1)+1,left,right);
} 
int main(){
	scanf("%1ld,%1ld",n,m);
	for(ll i=1;i<=n;i++) scanf("%1ld",a[i]);
	build(1,1,n);
	for(ll i=1;i<=m;i++){
		int kind;
		cin>>kind;
		if(kind==2){
			ll x,y;
			cin>>x>>y;
			printf("%1ld/n",query(1,x,y));
		}
		if(kind==1){
			ll x,y,k;
			cin>>x>>y>>k;
			for(ll i=x;i<=y;i++){
				add(1,i,k);
				a[i]+=k;
			}
		}
	}
	return 0;
}
2021/10/2 19:31
加载中...