求调
查看原帖
求调
1125009
liangxuanqi123楼主2024/11/27 22:07
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+3;
#define int long long
int a[N],d[N],c[N],b[N];
int mod;
void build(int s,int t,int p){
	c[p]=1;
    if(s==t){
        d[p]=a[s];return;
    }
    int mid=(s+t)>>1;
    build(s,mid,p*2);build(mid+1,t,p*2+1);
    d[p]=d[p*2]+d[p*2+1];d[p]%=mod;
}
void push_down(int s,int t,int p){
	int mid=(s+t)>>1;
	if(c[p]!=1){
		c[p*2]*=c[p];c[p*2]%=mod;
		c[p*2+1]*=c[p];c[p*2+1]%=mod;
		b[p*2]*=c[p];b[p*2]%=mod;
		b[p*2+1]*=c[p];b[p*2+1]%=mod;
		d[p*2]*=c[p];d[p*2]%=mod;
		d[p*2+1]*=c[p];d[p*2+1]%=mod;
		c[p]=1;
	}
	if(b[p]){
		d[p*2]+=b[p]*(mid-s+1);d[p*2]%=mod;
		d[p*2+1]+=b[p]*(t-mid);d[p*2]%=mod;
		b[p*2]+=b[p];b[p*2]%=mod;
		b[p*2+1]+=b[p];b[p*2+1]%=mod;
		b[p]=0;
	}
}
void update1(int l,int r,int s,int t,int p,int k){
	if(l<=s&&t<=r){
        d[p]+=(s-t+1)*k;d[p]%=mod;
        b[p]+=k;b[p]%=mod;
		return;
    }
	int mid=(s+t)>>1;
    push_down(s,t,p);
    if(l<=mid)update1(l,r,s,mid,p*2,k);
    if(r>mid)update1(l,r,mid+1,t,p*2+1,k);
    d[p]=d[p*2]+d[p*2+1];d[p]%=mod;
}
void update2(int l,int r,int s,int t,int p,int k){
    if(l<=s&&t<=r){
        c[p]*=k;c[p]%=mod;
        b[p]*=k;b[p]%=mod;
        d[p]*=k;d[p]%=mod;
		return;
    }
    int mid=(s+t)>>1;
    push_down(s,t,p);
    if(l<=mid)update2(l,r,s,mid,p*2,k);
    if(r>mid)update2(l,r,mid+1,t,p*2+1,k);
    d[p]=d[p*2]+d[p*2+1];d[p]%=mod;
}
int getsum(int l,int r,int s,int t,int p){
    if(l<=s&&r>=t){
        return d[p];
    }
    int mid=(s+t)>>1;
    push_down(s,t,p);
    int ans=0;
    if(l<=mid)ans+=getsum(l,r,s,mid,p*2),ans%=mod;
    if(r>mid)ans+=getsum(l,r,mid+1,t,p*2+1),ans%=mod;
    return ans;
}
signed main(){
    int n,m,op,x,y,k;
    cin>>n>>m>>mod;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,n,1);
    while(m--){
        cin>>op>>x>>y;
        if(op==1){
            cin>>k;
            update2(x,y,1,n,1,k);
        }
        else{
        	if(op==2){
        		cin>>k;
        		update1(x,y,1,n,1,k);
			}else{
				cout<<getsum(x,y,1,n,1)<<endl;
			}
        } 
    }
    return 0;
}
2024/11/27 22:07
加载中...