全部WA,求调
查看原帖
全部WA,求调
1013745
shu_ye楼主2024/7/18 11:58
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[1000010]={},t[2000010]={},tag[2000010]={};
void buid(int f,int l,int r){
	if(l==r){
		t[f]=a[l];
		return;
	}
	int mid=(l+r)/2;
	buit(f*2,l,mid);
	buit(f*2+1,mid+1,r);
	t[f]=t[f*2]+t[f*2+1];
}
void push(int left,int right,int f){
   int mid=(left+right)>>1;
   t[f<<1]+=tag[f]*(mid-left+1);
   t[f<<1|1]+=tag[f]*(right-mid);
   tag[f<<1]=tag[f];
   tag[f<<1|1]=tag[f];
   tag[f]=0;
}
int query(int l,int r,int left,int right,int f){
	int ans=0;
	if(l<=left&&r>=right){
		return t[f];
	}
	int mid=(left+right)/2;
	push(left,right,f);
	if(l<=mid){
		ans+=query(l,r,left,mid,f*2);
	}
	if(r>mid){
		ans+=query(l,r,mid+1,right,f*2+1);
	}
	return ans;
}
void update(int l,int r,int left,int right,int f,int k){
   if(l<=left&&r>=right){
       t[f]+=k*(right-left+1);
       tag[f]+=k;
       return;
   }
   push(left,right,f);
   int mid=(left+right)>>1;
   if(l<=mid) update(l,r,left,mid,f<<1,k);
   if(r>mid) update(l,r,mid+1,right,f<<1|1,k);
   t[f]=t[f<<1]+t[f<<1|1];
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	buit(1,1,n);
	while(m--){
		int c,l,r,k;
		scanf("%lld%lld%lld",&c,&l,&r);
		if(c==2){
			printf("%lld\n",query(l,r,1,n,1));
		}
		else{
			scanf("%lld",&k);
			update(l,r,1,n,1,k);
		}
	}
} 
2024/7/18 11:58
加载中...