蒟蒻线段树0pts求调
查看原帖
蒟蒻线段树0pts求调
1140231
ChangeYuAN楼主2024/7/16 20:24
#include<bits/stdc++.h>
using namespace std;
const int MAXLEN=1e5+5;
int n,m,t[MAXLEN<<2],a[MAXLEN],tag[MAXLEN<<2],opt,x,y,k;

void pushup(int x){
	t[x]=t[x<<1]+t[x<<1|1];
}

void build(int x,int l,int r){
	if(l==r) return t[x]=a[l],void();
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}

int query(int x,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr){
		return t[x];
	}
	int mid=(l+r)>>1,ret=0;
	if(ql<=mid){
		ret+=query(x<<1,l,mid,ql,qr);
	}if(qr>mid){
		ret+=query(x<<1|1,mid+1,r,ql,qr);
	}return ret;
}

void apply_tag(int x,int len,int dlt){
	t[x]+=len*dlt;
	tag[x]+=dlt;
}

void pushdown(int x,int l,int r){
	if(tag[x]){
		int mid=(l+r)>>1;
		apply_tag(x<<1,mid-l+1,tag[x]);
		apply_tag(x<<1|1,r-mid,tag[x]);
		tag[x]=0; 
	}
}

void change(int x,int l,int r,int cl,int cr,int dlt){
	pushdown(x,l,r);
	if(cl<=l&&r<=cr){
		apply_tag(x,r-l+1,dlt);
		return ;
	}
	int mid=(l+r)>>1;
	if(cl<=mid){
		change(x<<1,l,mid,cl,cr,dlt);
	}if(cr>mid){
		change(x<<1|1,mid+1,r,cl,cr,dlt); 
	}pushup(x);
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>opt;
		if(opt==1){
			cin>>x>>y>>k;
			change(1,1,n,x,y,k);
		}else if(opt==2){
			cin>>x>>y;
			cout<<query(1,1,n,x,y)<<'\n';
		}
	}return 0;
}
2024/7/16 20:24
加载中...