几近疯癫
查看原帖
几近疯癫
528853
zh1221_qwq楼主2023/6/21 15:22
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+5;
long long n,m,k[N],ans,t=1;
struct node{
	int l,r,sum,tag;
}a[4*N];
void build(int l,int r,int u){
	if(l==r){
		a[u].sum=k[l];
		return;
	}
	long long mid=(l+r)/2;
	a[u].l=++t;
	build(l,mid,a[u].l);
	a[u].r=++t;
	build(mid+1,r,a[u].r);
	a[u].sum=a[a[u].r].sum+a[a[u].l].sum;
}
void pushup(int u){
	a[u].sum=a[a[u].l].sum+a[a[u].r].sum;
}
void pushdown(int l,int r,int u){
	int mid=(l+r)/2;
	a[a[u].l].sum+=(mid-l+1)*a[u].tag;
	a[a[u].r].sum+=(r-mid)*a[u].tag;
	a[a[u].l].tag=a[u].tag;
	a[a[u].r].tag=a[u].tag;
	a[u].tag=0;
}
void update(int l,int r,int lc,int rc,int u,int w){
	if(l==lc&&r==rc){
		a[u].sum+=(r-l+1)*w;
		a[u].tag+=w;
		return;
	}
	int mid=(l+r)/2;
	pushdown(l,r,u);
	if(rc<=mid)update(l,mid,lc,rc,a[u].l,w);
	else if(lc>mid)update(mid+1,r,lc,rc,a[u].r,w);
	else {
		update(l,mid,lc,mid,a[u].l,w);
		update(mid+1,r,mid+1,rc,a[u].r,w);
	}
	pushup(u);
}
void query(int l,int r,int lc,int rc,int u){
	if(l==lc&&r==rc){
		ans+=a[u].sum;
		return;
	}
	int mid=(l+r)/2;
	if(rc<=mid)query(l,mid,lc,rc,a[u].l);
	else if(lc>mid)query(mid+1,r,lc,rc,a[u].r);
	else {
		query(l,mid,lc,mid,a[u].l);
		query(mid+1,r,mid+1,rc,a[u].r);
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>k[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int tot;
		cin>>tot;
		if(tot==1){
			int l,r,w;
			cin>>l>>r>>w;
			update(1,n,l,r,1,w);
		}
		else {
			int l,r;
			cin>>l>>r;
			query(1,n,l,r,1);
			cout<<ans<<endl;
			ans=0;
		}
	}
}

零分求调

2023/6/21 15:22
加载中...