RE 0pts求助
查看原帖
RE 0pts求助
809165
The_Wandering_Earth楼主2023/1/7 21:42
#include<bits/stdc++.h>
#define lid (id*2)
#define rid (id*2+1)
#define int long long
using namespace std;
const int maxn=100005;
int n,a[maxn],op,q;
struct seg_tree{int l,r,sum,lazy;}tr[maxn*4];
void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r;
	if(l==r)tr[id].sum=a[l];
	else{
		int mid=(l+r)/2;
		build(lid,l,mid);
		build(rid,mid+1,r);
		tr[id].sum=tr[lid].sum+tr[rid].sum;
	}
} 
void pushdown(int id){
	if(tr[id].l!=tr[id].r&&tr[id].lazy!=0){
		tr[lid].lazy+=tr[id].lazy;
		tr[rid].lazy+=tr[id].lazy;
		tr[lid].sum+=tr[id].lazy*(tr[lid].r-tr[lid].l+1);
		tr[rid].sum+=tr[id].lazy*(tr[rid].r-tr[rid].l+1);
		tr[id].lazy=0;
	}
}
void add(int id,int l,int r,int k){
	pushdown(id);
	if(tr[id].l==tr[id].r){
		tr[id].sum+=(tr[id].r-tr[id].l+1)*k,tr[id].lazy+=k;
		return;
	}
	int mid=(tr[id].l+tr[id].r)/2;
	if(r<=mid)add(lid,l,r,k);   
	else if(l>mid)add(rid,l,r,k);
	else {
		add(lid,l,mid,k);
		add(rid,mid+1,r,k);
	}
	tr[id].sum=tr[lid].sum+tr[rid].sum;
}
int query(int id,int l,int r){
	pushdown(id);
	if(tr[id].l==l&&tr[id].r==r)return tr[id].sum;
	int mid=(tr[id].l+tr[id].r)>>1;
	if(r<=mid)return query(lid,l,r);
	if(l>mid)return query(rid,l,r);
	return query(lid,l,mid)+query(rid,mid+1,r);
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	while(q--){
		cin>>op;
		if(op==1){
			int x,y,k;
			scanf("%d%d%d",&x,&y,&k);
			add(1,x,y,k);
		}
		if(op==2){
			int left,right;
			scanf("%d%d",&left,&right);
			printf("%d\n",query(1,left,right));
		}
	}
}
2023/1/7 21:42
加载中...