线段树 0pts 求助
查看原帖
线段树 0pts 求助
658875
Catcats楼主2022/8/3 14:20

rt,全RE,求调,感觉没啥大问题但就是RE了

#include<bits/stdc++.h>
using namespace std;
#define int long
#define in(l,r,le,ri) (((ri)<=(r))&&((l)>=(le)))
#define out(l,r,le,ri) (((l)>(ri))||((r)<(le)))
#define elif else if
int a[114514],w[114514*4],tag[114514*4];
void pushup(int u,int w[]){
	w[u]=w[u*2]+w[u*2+1];
}
void init(int u,int l,int r,int a[],int w[]){
	if(l==r){
		w[u]=a[l];return;
	}
	int m=l+r>>1ll;
	init(u<<1ll,l,m,a,w),init((u<<1)+1ll,m+1ll,r,a,w);
	pushup(u,w);
}
void make(int u,int l,int x,int tag[],int w[]){
	tag[u]+=x;
	w[u]+=x*l;
}
void pushdown(int u,int l,int r,int tag[],int w[]){
	int m=l+r>>1ll;
	make(u<<1ll,m-l+1,tag[u],tag,w),make((u<<1ll)+1ll,r-m,tag[u],tag,w);
	tag[u]=0;
}
int query(int u,int L,int R,int l,int r,int tag[],int w[]){
	if(in(L,R,l,r))return w[u];
	elif(out(L,R,l,r))return 0;
	else{
		int m=L+R>>1;
		pushdown(u,L,R,tag,w);
		return query(u<<1ll,L,m,l,r,tag,w)+query((u<<1ll)+1ll,m+1ll,R,l,r,tag,w);
	}
}
void update(int u,int L,int R,int l,int r,int x,int tag[],int w[]){
	if(in(L,R,l,r))make(u,R-L+1ll,x,tag,w);
	elif(out(L,R,l,r));
	else{
		int m=L+R>>1;
		pushdown(u,L,R,tag,w);
		update(u<<1ll,L,m,l,r,x,tag,w),update((u<<1ll)+1ll,m+1ll,R,l,r,x,tag,w);
		pushup(u,w);
	}
}
#undef int
int main(){
    #define int long
	int n,m;cin>>n>>m;
	int a[n+1ll]={0},w[(n<<2)+1]={0},tag[(n<<2)+1]={0};
	for(int i=0;i<n;i++)cin>>a[i+1];//!!!
	init(1,1,n,a,w);
	while(m--){
		int t,x,y;
		cin>>t>>x>>y;
		if(t==1){
			int k;cin>>k;
			update(1,1,n,x,y,k,tag,w);
		}
		else{
			cout<<query(1,1,n,x,y,tag,w)<<endl;
		}
	}
    #undef int
}
2022/8/3 14:20
加载中...