70
查看原帖
70
400150
云言一三楼主2022/9/4 21:03

代码

#include<bits/stdc++.h>
#define lc p*2
#define rc p*2+1
using namespace std;
long long n,m,w[400012];
struct node{
	long long l,r,ans,add;
}node[400012];
void build(long long p,long long l,long long r){
	node[p].l=l;node[p].r=r;
	if(l==r){
		node[p].ans=w[l];
	    return;
	}
	long long mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	node[p].ans=node[lc].ans+node[rc].ans;
}
void pushdown(long long p){
	if(node[p].add){
		node[lc].ans+=node[p].add*(node[lc].r-node[lc].l+1);
		node[rc].ans+=node[p].add*(node[rc].r-node[rc].l+1);
		node[lc].add+=node[p].add;
		node[rc].add+=node[p].add;
		node[p].add=0;
	}
}
int que(long long p,long long x,long long y){
	if(x<=node[p].l&&node[p].r<=y){
		return node[p].ans;
	}
	pushdown(p);
	long long mid=node[p].l+node[p].r>>1;
	long long sum=0;
	if(x<=mid)sum+=que(lc,x,y);
	if(y>mid)sum+=que(rc,x,y);
	return sum;
}
void update(long long p,long long x,long long y,long long k){
	if(x<=node[p].l&&node[p].r<=y){
		node[p].ans+=(node[p].r-node[p].l+1)*k;
		node[p].add+=k;
		return;
	}
	pushdown(p);
	long long mid=node[p].l+node[p].r>>1;
	if(x<=mid)update(lc,x,y,k);
	if(y>mid)update(rc,x,y,k);
	node[p].ans=node[lc].ans+node[rc].ans;
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++)cin>>w[i];
	build(1,1,n);
	for(long long i=1;i<=m;i++){
		int pd;
		cin>>pd;
		if(pd==1){
			long long x,y,k;
			cin>>x>>y>>k;
			update(1,x,y,k);
		}
		if(pd==2){
			long long x,y;
			cin>>x>>y;
			cout<<que(1,x,y)<<"\n";
		}
	}
}

最后三个点

2022/9/4 21:03
加载中...