求调
查看原帖
求调
1458109
__czh__楼主2025/1/11 15:07

WA70,求大佬帮助

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
long long n,m,c,s,r,o,d,a[N];
struct node{ 
	long long l,r,sum,tag;
}tre[N<<2];
void pushup(long long num){
	tre[num].sum=tre[num<<1].sum+tre[num<<1|1].sum;
}
void pushdown(long long num){
	if(tre[num].tag!=0){
		tre[num<<1].tag+=tre[num].tag;
		tre[num<<1|1].tag+=tre[num].tag;
		tre[num<<1].sum+=tre[num].tag*(tre[num<<1].r-tre[num<<1].l+1);
		tre[num<<1|1].sum+=tre[num].tag*(tre[num<<1|1].r-tre[num<<1|1].l+1);
		tre[num].tag=0;
	}
}
void build(long long num,long long ll,long long rr){
	tre[num].l=ll;
	tre[num].r=rr;
	tre[num].tag=0;
	if(ll==rr){
		tre[num].sum=a[ll];
		return ;
	}
	int mid=ll+rr>>1;
	build(num<<1,ll,mid);
	build(num<<1|1,mid+1,rr);
	pushup(num);
}
void modify(long long num,long long L,long long R,long long x){
	if(tre[num].r<L||tre[num].l>R)return ;
	if(tre[num].l>=L && tre[num].r<=R){
		tre[num].sum+=(tre[num].r-tre[num].l+1)*x;
		tre[num].tag+=x;
		return ;
	}
	pushdown(num);
	modify(num<<1,L,R,x);
	modify(num<<1|1,L,R,x);
	pushup(num);
}
int query(long long num,long long L,long long R){
	if(tre[num].r<L||tre[num].l>R)return 0;
	if(tre[num].l>=L && tre[num].r<=R)return tre[num].sum;
	pushdown(num);
	return query(num<<1,L,R)+query(num<<1|1,L,R);
} 
int main(){
	cin>>c>>r;
	for(int i=1;i<=c;i++){
		cin>>a[i];
	}
	build(1,1,c);
	while(r--){
		cin>>s;
		if(s==1){
			cin>>o>>d>>n;
			modify(1,o,d,n);
		}
		else{
			cin>>o>>d;
			cout<<query(1,o,d)<<endl;
		}
	}
	return 0;
} 
2025/1/11 15:07
加载中...