线段树2 全WA求调
查看原帖
线段树2 全WA求调
1283976
sllhy7楼主2025/2/8 09:41
#include<bits/stdc++.h>
using namespace std;
long long x,y,k,pd,n,m,b[100010],mod;
struct tree{
	long long lc,rc,v,la,la2,le;
}a[400010];
void build(long long ro,long long l,long long r){
	a[ro].lc=l;
	a[ro].rc=r;
	a[ro].le=r-l+1;
	a[ro].la=0;
	a[ro].la2=1;
	if(l==r){
		a[ro].v=b[l]%mod;
	}
	else{
		long long mid=(l+r)/2;
		build(ro*2,l,mid);
		build(ro*2+1,mid+1,r);
		a[ro].v=(a[ro*2].v+a[ro*2+1].v)%mod;
	}
	return ;
}

void pushdown(long long root){
		a[root*2].v=((a[root].la*a[root*2].le)%mod+a[root].la2*a[root*2].v)%mod;
		a[root*2+1].v=((a[root].la*a[root*2+1].le)%mod+a[root].la2*a[root*2+1].v)%mod;
		a[root*2].la2=(a[root].la2*a[root*2].la2)%mod;
		a[root*2+1].la2=(a[root].la2*a[root*2+1].la2)%mod;
		a[root*2].la=(a[root].la2*a[root*2].la+a[root].la)%mod;
		a[root*2+1].la=(a[root].la2*a[root*2+1].la+a[root].la)%mod;
		a[root].la2=1;
		a[root].la=0;
	return ;
} 

void update(long long ro,long long lch,long long rch,long long add){
	if(lch<=a[ro].lc&&a[ro].rc<=rch){
		a[ro].la=(a[ro].la+add)%mod;
		a[ro].v=(a[ro].v+(add*a[ro].le)%mod)%mod;
		return ;
	}
	if(a[ro].lc>rch||a[ro].rc<lch){
		return ;
	}
	if(a[ro].la!=0||a[ro].la2!=1){
		pushdown(ro);
	}

	update(ro*2,lch,rch,add);
	update(ro*2+1,lch,rch,add);
	a[ro].v=(a[ro*2].v+a[ro*2+1].v)%mod;
	return ;
}

void chen(long long ro,long long lch,long long rch,long long add){
	if(lch<=a[ro].lc&&a[ro].rc<=rch){
		a[ro].la=(a[ro].la*add)%mod;
		a[ro].la2=(a[ro].la2*add)%mod;
		a[ro].v=(a[ro].v*add)%mod;
		return ;
	}
	if(a[ro].lc>rch||a[ro].rc<lch){
		return ;
	}
	if(a[ro].la!=0||a[ro].la2!=1){
		pushdown(ro);
	}
	update(ro*2,lch,rch,add);
	update(ro*2+1,lch,rch,add);
	a[ro].v=(a[ro*2].v+a[ro*2+1].v)%mod;
	return ;
}

long long he(long long root,long long l,long long r){
	if(l<=a[root].lc&&a[root].rc<=r){
		return (a[root].v%mod);
	}
	if(a[root].lc>r||a[root].rc<l){
		return 0;
	}
	if(a[root].la!=0||a[root].la2!=1){
		pushdown(root);
	}
	return ((he(root*2,l,r)%mod+he(root*2+1,l,r)%mod)%mod);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>mod;
	for(long long i=1;i<=n;i++){
		cin>>b[i];
	}
	build(1,1,n);
	for(long long i=1;i<=m;i++){
		cin>>pd>>x>>y;
		if(pd==1){
			cin>>k;
			k=k%mod;
			chen(1,x,y,k);
		}
		else if(pd==2){
			cin>>k;
			update(1,x,y,k);
		}
		else{
			cout<<(he(1,x,y)%mod)<<"\n"; 
		}
	}
	return 0;
}


2025/2/8 09:41
加载中...