萌新刚学OI 1ms,30pts求调
查看原帖
萌新刚学OI 1ms,30pts求调
973480
封禁用户楼主2025/7/29 10:40
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100010;
int n,q,m,a[N],id[N],s[N],add[N],mul[N],len;

void pushdown(int x) {
    if(mul[x]==1 && add[x]==0) return;
    int l=(x-1)*len+1, r=min(x*len,n);
    for(int i=l;i<=r;i++) 
        a[i]=(a[i]*mul[x]+add[x])%m;
    mul[x]=1; add[x]=0;
}

void init() {
    len=sqrt(n)+1;
    for(int i=1;i<=n;i++) {
        id[i]=(i-1)/len+1;
        s[id[i]]=(s[id[i]]+a[i])%m;
        mul[id[i]]=1;
        add[id[i]]=0;
    }
}

void range_add(int x,int y,int k) {
    int idx=id[x], idy=id[y];
    if(idx==idy) {
        pushdown(idx);
        for(int i=x;i<=y;i++) {
            a[i]=(a[i]+k)%m;
            s[idx]=(s[idx]+k)%m;
        }
    } else {
        for(int i=idx+1;i<=idy-1;i++) {
            add[i]=(add[i]+k)%m;
            s[i]=(s[i]+k*len)%m;
        }
        pushdown(idx); pushdown(idy);
        for(int i=x;id[i]==idx;i++) {
            a[i]=(a[i]+k)%m;
            s[idx]=(s[idx]+k)%m;
        }
        for(int i=y;id[i]==idy;i--) {
            a[i]=(a[i]+k)%m;
            s[idy]=(s[idy]+k)%m;
        }
    }
}

void range_mul(int x,int y,int k) {
    int idx=id[x], idy=id[y];
    if(idx==idy) {
        pushdown(idx);
        for(int i=x;i<=y;i++) {
            a[i]=(a[i]*k)%m;
            s[idx]=(s[idx]*k)%m;
        }
    } else {
        for(int i=idx+1;i<=idy-1;i++) {
            mul[i]=(mul[i]*k)%m;
            add[i]=(add[i]*k)%m;
            s[i]=(s[i]*k)%m;
        }
        pushdown(idx); pushdown(idy);
        for(int i=x;id[i]==idx;i++) {
            a[i]=(a[i]*k)%m;
            s[idx]=(s[idx]*k)%m;
        }
        for(int i=y;id[i]==idy;i--) {
            a[i]=(a[i]*k)%m;
            s[idy]=(s[idy]*k)%m;
        }
    }
}

int query(int x,int y) {
    int res=0, idx=id[x], idy=id[y];
    if(idx==idy) {
        pushdown(idx);
        for(int i=x;i<=y;i++) 
            res=(res+a[i])%m;
    } else {
        for(int i=idx+1;i<=idy-1;i++) 
            res=(res+s[i])%m;
        pushdown(idx); pushdown(idy);
        for(int i=x;id[i]==idx;i++) 
            res=(res+a[i])%m;
        for(int i=y;id[i]==idy;i--) 
            res=(res+a[i])%m;
    }
    return res;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>q>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    init();
    while(q--) {
        int op,x,y,k;
        cin>>op;
        if(op==1) {
            cin>>x>>y>>k;
            range_mul(x,y,k);
        } else if(op==2) {
            cin>>x>>y>>k;
            range_add(x,y,k);
        } else {
            cin>>x>>y;
            cout<<query(x,y)%m<<"\n";
        }
    }
    return 0;
}
2025/7/29 10:40
加载中...