求助
查看原帖
求助
705012
Miss_SGT楼主2023/1/22 19:50
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+5;
struct tree{
	int l,r;
	ll date,ad;
}t[4*maxn];
ll a[maxn],f;
int n,m;
int op,p,q;
void b(int x,int y,int s){
	t[s].l=x;
	t[s].r=y;
	if(x==y){
		t[s].date=a[x];
		return;
	}
	int mid=(x+y)>>1;
	b(x,mid,2*s);
	b(mid+1,y,2*s+1);
	t[s].date=t[s*2].date+t[s*2+1].date;
	return;
}//建树 
void bj(int s){
	if(t[s].ad){
		t[s].date+=t[s].ad*(t[s].r-t[s].l+1);
		t[s*2].ad+=t[s].ad;
		t[s*2+1].ad+=t[s].ad;
		t[s].ad=0;
	}
	return;
}//标记下移 
void add(int x,int y,int s,ll k){
	if(x<=t[s].l&&t[s].r<=y){
		t[s].date+=(k*(t[s].r-t[s].l+1));
		t[s].ad+=k;
		return;
	}
	bj(s);
	int mid=(t[s].l+t[s].r)>>1;
	if(x<=mid) add(x,mid,s*2,k);
	if(y>mid) add(mid+1,y,s*2+1,k);
	t[s].date=t[s*2].date+t[s*2+1].date;
	return;
}
ll get(int x,int y,int s){
	bj(s);
	if(x<=t[s].l&&t[s].r<=y) return t[s].date;
	int mid=(t[s].l+t[s].r)>>1;
	ll ans=0;
	if(x<=mid) ans+=get(x,mid,s*2);
	if(mid<y) ans+=get(mid+1,y,s*2+1);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) 
		scanf("%lld",&a[i]);
	b(1,n,1);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&op,&q,&p);
		if(op==1){
			scanf("%lld",&f);
			add(q,p,1,f);
		}else printf("%lld\n",get(q,p,1));					
	}
    return 0;
}
2023/1/22 19:50
加载中...