70分求调
查看原帖
70分求调
730894
Cockroach_hzs楼主2023/10/18 09:45
#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1
#define ll long long
using namespace std;
const int N=1e7;
struct tree{
	ll l,r,lazy,sum;
}tr[4*N];
ll a[N],n,m,a1,b,c,k;
void up(int p){
		tr[p].sum=tr[lp].sum+tr[rp].sum;
	}
void down(int p){
		if(tr[p].lazy){
			tr[lp].sum+=(tr[lp].r-tr[lp].l+1)*tr[p].lazy;
			tr[rp].sum+=(tr[rp].r-tr[rp].l+1)*tr[p].lazy;
			tr[lp].lazy+=tr[p].lazy;
			tr[rp].lazy+=tr[p].lazy;
			tr[p].lazy=0;
		}
	}
void build(int p,int l,int r){
		tr[p]={l,r,0,0};
		if(l==r){
			tr[p].sum=a[l];
			return;
		} 
		int mid=(l+r)>>1;
		build(lp,l,mid);
		build(rp,mid+1,r);
		up(p);
	}
int cha(int p,int l,int r){
		if(l<=tr[p].l&&tr[p].r<=r){
			return tr[p].sum;
		}
		int mid=(tr[p].l+tr[p].r)>>1;
		int sum=0;
		down(p);
		if(l<=mid) sum+=cha(lp,l,r);
		if(r>mid) sum+=cha(rp,l,r);
		return sum;
	}
void change(int p,int l,int r,int v){
		if(l<=tr[p].l&&tr[p].r<=r){
			tr[p].sum+=(tr[p].r-tr[p].l+1)*v;
			tr[p].lazy+=v;
			return;
		}
		int mid=(tr[p].l+tr[p].r)/2;
		down(p);
		if(l<=mid) change(lp,l,r,v);
		if(r>mid) change(rp,l,r,v);
		up(p);
	}
int 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>>c;
		if(c==1){
			cin>>a1>>b>>k;
			change(1,a1,b,k);
		}
		else{
			int w;
			cin>>a1>>b;
			w=cha(1,a1,b);
			cout<<w<<endl;
		}
	}
	return 0;
}
2023/10/18 09:45
加载中...