求大佬调J
查看原帖
求大佬调J
1015796
Lingyu_fly楼主2024/11/26 19:43

本人已经是大粪了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,q,m;
int a[N];
struct tr{
    int l,r,sum,fac,lazy;
}tree[N<<2];
void pushup(int u){
    tree[u].sum=(tree[u<<1].sum+tree[u<<1|1].sum)%m;
}
void build(int u,int l,int r){
    tree[u]={l,r,0,1,0};
    if(l==r){
        tree[u].sum=a[l];
        return ;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}
void pushdown(int u){
    tree[u<<1].sum=(tree[u<<1].sum*tree[u].fac+(tree[u<<1].r-tree[u<<1].l+1)*tree[u].lazy)%m;
    tree[u<<1|1].sum=(tree[u<<1|1].sum*tree[u].fac+(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].lazy)%m;
    tree[u<<1].fac*=tree[u].fac%m;
    tree[u<<1|1].fac*=tree[u].fac%m;
    tree[u<<1].lazy=(tree[u<<1].lazy*tree[u].fac+tree[u].lazy)%m;
    tree[u<<1|1].lazy=(tree[u<<1|1].lazy*tree[u].fac+tree[u].lazy)%m;
    tree[u].fac=1;tree[u].sum=0;
}
void modify(int u,int l,int r,int k,int op){
    if(l<=tree[u].l&&tree[u].r<=r){
        if(op){
            tree[u].sum=(tree[u].sum+(tree[u].r-tree[u].l+1)*k)%m;
            tree[u].lazy=(tree[u].lazy+k)%m;
        }else{
            tree[u].sum=(tree[u].sum*k)%m;
            tree[u].fac=(tree[u].fac*k)%m;
            tree[u].lazy=(tree[u].lazy*k)%m;
        }
        return ;
    }
    pushdown(u);
    int mid=tree[u].l+tree[u].r>>1;
    if(l<=mid) modify(u<<1,l,r,k,op);
    if(mid<r) modify(u<<1|1,l,r,k,op);
    pushup(u);
}
int query(int u,int l,int r){
    if(l<=tree[u].l&&tree[u].r<=r){
        return tree[u].sum%m;
    }
    pushdown(u);
    int mid=tree[u].l+tree[u].r>>1;
    int ans=0;
    if(l<=mid) ans+=query(u<<1,l,r)%m;
    if(mid<r) ans+=query(u<<1|1,l,r)%m;
    return ans%m;
}
signed main(){
    scanf("%lld%lld%lld",&n,&q,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    int op,x,y,k;
    while(q--){
        scanf("%lld%lld%lld",&op,&x,&y);
        if(op==1){
            scanf("%lld",&k);
            modify(1,x,y,k,0);
        }else if(op==2){
            scanf("%lld",&k);
            modify(1,x,y,k,1);
        }else{
            printf("%lld\n",query(1,x,y)%m);
        }
    }
    return 0;
}
2024/11/26 19:43
加载中...