qj
查看原帖
qj
1036685
hehehy楼主2024/6/5 18:10
#include<bits/stdc++.h>
using namespace std;
int n,q,mod,k,op,x,y;
long long a[100005],la[500005],la2[500005],b[500005];
void build(int l,int r,int u){
    la2[u]=1;
	if(l==r){
		b[u]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,u*2);
	build(mid+1,r,u*2+1);
	b[u]=b[u*2]+b[u*2+1];
	b[u]%=mod;
}
void pushdown(int l,int r,int u){
	int mid=(l+r)/2;
	b[u*2]=(b[u*2]*la2[u]+(mid-l+1)*la[u])%mod;
	b[u*2+1]=(b[u*2+1]*la2[u]+(mid-l+1)*la[u])%mod;
	la2[u*2]*=la2[u];
	la2[u*2]%=mod;
	la2[u*2+1]*=la2[u];
	la2[u*2+1]%=mod;
	la[u*2]=(la[u*2]*la2[u]+la[u])%mod;
	la[u*2+1]=(la[u*2+1]*la2[u]+la[u])%mod;
	la[u]=0;
	la2[u]=1;
}
void update(int l,int r,int u,int ql,int qr){
	if(ql>r||qr<l){
		return ;
	}
	if(ql<=l&&qr>=r){
		b[u]+=k*(r-l+1);
		b[u]%=mod;
		la[u]+=k;
		la[u]%=mod;
		return ;
	}
	pushdown(l,r,u);
	int mid=(l+r)/2;
	update(l,mid,u*2,ql,qr);
	update(mid+1,r,u*2+1,ql,qr);
	b[u]=b[u*2]+b[u*2+1];
	b[u]%=mod;
}
void update2(int l,int r,int u,int ql,int qr){
	if(ql>r||qr<l){
		return ;
	}
	if(ql<=l&&qr>=r){
		b[u]*=k;
		b[u]%=mod;
		la2[u]*=k;
		la2[u]%=mod;
		la[u]*=k;
		la[u]%=mod;
		return ;
	}
	pushdown(l,r,u);
	int mid=(l+r)/2;
	update(l,mid,u*2,ql,qr);
	update(mid+1,r,u*2+1,ql,qr);
	b[u]=b[u*2]+b[u*2+1];
	b[u]%=mod;
}
long long query(int l,int r,int u,int ql,int qr){
	if(ql>r||qr<l){
		return 0;
	}
	if(ql<=l&&qr>=r){
		return b[u];
	}
	pushdown(l,r,u);
	int mid=(l+r)/2;
	return (query(l,mid,u*2,ql,qr)+query(mid+1,r,u*2+1,ql,qr))%mod;
}
int main(){
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]%=mod;
	}
	build(1,n,1);
	while(q--){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			k%=mod;
            update2(1,n,1,x,y);
		}else if(op==2){
			cin>>k;
			k%=mod;
			update(1,n,1,x,y);
		}else{
			cout<<query(1,n,1,x,y)%mod<<"\n";
		}
	}
}
2024/6/5 18:10
加载中...