新手RE求救
查看原帖
新手RE求救
1382982
jikky楼主2024/7/16 09:21
#include<bits/stdc++.h>
using namespace std;
struct tree{
	int l,r;
	int sum;
	int fc,fj;
}a[500000002];
void push_up(int u){
	a[u].sum=a[u<<1].sum+a[u<<1|1].sum;
}
void downj(int k){
	a[k<<1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].fj;
	a[k<<1|1].sum+=(a[k<<1|1].r-a[k<<1|1].l+1)*a[k].fj;
	a[k<<1].fj=a[k].fj;
	a[k<<1|1].fj=a[k].fj;
	a[k].fj=0;
}
void downc(int k){
	a[k<<1].sum*=a[k].fc;
	a[k<<1|1].sum*=a[k].fc;
	a[k<<1].fc=a[k].fc;
	a[k<<1|1].fc=a[k].fc;
	a[k].fc=0;
}
void build(int k,int l,int r){
	if(l==r){
		int t;
		scanf("%d",&t);
		a[k].sum=t;
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	push_up(k);
	return;
}
void ch(int u,int l,int r,int x){
	if(a[u].l>=l and a[u].r<=r){
		a[u].sum*=x;         
		a[u].fc+=x;
		downc(u);
		return;
	}
	int mid=a[u].l+a[u].r>>1;
	if(l<=mid) ch(u<<1,l,r,x);
	if(r>mid) ch(u<<1|1,l,r,x);
	//return;
}

void pl(int u,int l,int r,int x){
	if(a[u].l>=l and a[u].r<=r){
		a[u].sum+=(a[u].r-a[u].l+1)*x;
		a[u].fj+=x;
		downj(u);
		return;
	}

	int mid=(a[u].l+a[u].r)>>1;
	if(l<=mid) ch(u<<1,l,r,x);
	if(mid<r) ch(u<<1|1,l,r,x);
	return;
}

long long ask(int u,int l,int r){
	if(a[u].l>=l and a[u].r<=r){
		if(a[u].fc){
			downc(u);
		}
		if(a[u].fj){
			downj(u);
		}
		return a[u].sum;
	}
	int mid=a[u].l+a[u].r>>1;
	int v=0;
	if(l<=mid){
		v=ask(u<<1,l,r);
	}
	if(r>mid) v+=ask(u<<1|1,l,r);
	return v;
}

int main(){
	int n,q,m;
	scanf("%d%d%d",&n,&q,&m);
	build(1,1,n);
	int x,y,k;
	for(int i=0;i<q;i++){
		int t1;
		scanf("%d",&t1);
		if(t1==1){
			scanf("%d%d%d",&x,&y,&k);
			ch(1,x,y,k);
		}
		if(t1==2){
			scanf("%d%d%d",&x,&y,&k);
			pl(1,x,y,k);
		}
		if(t1==3){
			scanf("%d%d",&x,&y);
			printf("%d",ask(1,x,y));
		}
	}
	return 0;
}
2024/7/16 09:21
加载中...