10分求助
查看原帖
10分求助
458493
__BAI__楼主2022/10/5 22:29
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int lazy[400005],tree[400005],n,a[100005],m,x,y,k,z;
void built(int d,int l,int r){
	if(l>=r)return;
	if(l==r-1){tree[d]=a[l];return;}
	int mid=(l+r)/2;
	int l_kid=d*2;
	int r_kid=d*2+1;
	built(l_kid,l,mid);
	built(r_kid,mid,r);
	tree[d]=tree[l_kid]+tree[r_kid];
}
void add(int d,int l,int r,int p,int q,int v){
	if(p==l and q==r){lazy[d]+=v;tree[d]+=(r-l)*v;return;}
	int mid=(l+r)/2;
	int l_kid=d*2;
	int r_kid=d*2+1;
	if(p>=mid)add(r_kid,mid,r,p,q,v);
	else if(q<=mid)add(l_kid,l,mid,p,q,v);
	else{
		add(l_kid,l,mid,p,mid,v);
		add(r_kid,mid,r,mid,q,v);
	}
	tree[d]=tree[l_kid]+tree[r_kid];
}
int get(int d,int l,int r,int p,int q,int v){
	if(p==l and q==r)return tree[d]+=(r-l)*v;
	v+=lazy[d];
	int mid=(l+r)/2;
	int l_kid=d*2;
	int r_kid=d*2+1;
	lazy[d]=0;
	if(p>=mid)return get(r_kid,mid,r,p,q,v);
	if(q<=mid)return get(l_kid,l,mid,p,q,v);
	return get(l_kid,l,mid,p,mid,v)+get(r_kid,mid,r,mid,q,v);
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	built(1,1,n+1);
	while(m--){
		z=read();
		if(z==1){
			x=read(),y=read(),k=read();
			add(1,1,n+1,x,y+1,k);
		}else{
			x=read(),y=read();
			printf("%d\n",get(1,1,n+1,x,y+1,0));
		}
	}
} 
2022/10/5 22:29
加载中...