求助0分
查看原帖
求助0分
357128
Great_juruo楼主2022/1/25 21:39
#include <bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m,a[N],t[N];
int lazy[N];
void pushup(int k){
	t[k]=t[k*2]+t[k*2+1];
} 
void build(int k,int l,int r){
	if(l==r){
		t[k]=a[l];
		return;
	}
	else{
		int mid=(l+r)/2;
		build(k*2,l,mid);
		build(k*2+1,mid+1,r);
		pushup(k);
	}
}
void f(int k,int l,int r,int v){
	lazy[k]=lazy[k]+v;
    t[k]=t[k]+v*(r-l+1);
}
void pushdown(int k,int l,int r){
	int mid=(l+r)/2;
    f(k/2,l,mid,lazy[k]);
    f(k/2+1,mid+1,r,lazy[k]);
    lazy[k]=0;
}
int update(int L,int R,int v,int l,int r,int k){
	if(L<=l&&r<=R){
		t[k]+=v;
		lazy[k]+=v;
	}else{
		pushdown(k,l,r); 
		int mid=l+((r-l)/2);
		if(l<=mid){
			update(L,R,v,l,mid,k*2);
		} 
		if(mid<r){
			update(L,R,v,mid+1,r,k*2|1);
		}
		pushup(k);
	}
}
int query(int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		return t[k];
	}else{
		int res=0;
		int mid=(l+r)/2;
		pushdown(k,l,r);
		if(l<=mid){
			res+=query(l,mid,L,R,k*2);
		}
		if(mid<r){
			res+=query(mid+1,r,L,R,k*2+1);
		}
		return res;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	} 
	build(1,1,n);
	int x,y,k,quiz;
	for(int i=1;i<=m;i++){
		cin>>quiz;
		if(quiz==1){
			scanf("%d%d%d",&x,&y,&k);
			update(1,n,k,x,y,1);
		}
		if(quiz==2){
			scanf("%d%d",&x,&y);
			cout<<query(x,y,1,n,1)<<'\n';
		}
	} 
	return 0;
}
2022/1/25 21:39
加载中...