求助
查看原帖
求助
461616
Judgelight楼主2022/8/6 10:42

RT,代码不难看

#include<bits/stdc++.h>
#define int long long
#define N 100009
using namespace std;
int n,m,p,a[N];
struct Node{
    int sum,add,mul,l,r;
}tr[N*4];
void pushup(int u){
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
    tr[u].sum%=p;
}
void eval(Node t,int add,int mul){
    t.sum=(t.sum*mul+(t.r-t.l+1)*add)%p;
    t.mul=t.mul*mul%p;
    t.add=(t.add*mul+add)%p;
}
void pushdown(int u){
    eval(tr[u<<1],tr[u].add,tr[u].mul);
    eval(tr[u<<1|1],tr[u].add,tr[u].mul);
    tr[u].add=0,tr[u].mul=1;
}
void build(int u,int l,int r){
    tr[u].l=l,tr[u].r=r,tr[u].add=0,tr[u].mul=1;
    if(l==r){
        tr[u].sum=a[l];
        return ;
    }
    tr[u].sum=0;
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}
void modify(int u,int l,int r,int add,int mul){
    if(tr[u].l>=l&&tr[u].r<=r){
        eval(tr[u],add,mul);
        return ;
    }
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1;
    if(l<=mid){
        modify(u<<1,l,r,add,mul);
    }
    if(r>mid){
        modify(u<<1|1,l,r,add,mul);
    }
    pushup(u);
}
int query(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r){
        return tr[u].sum;
    }
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1,ans=0;
    if(l<=mid){
        ans+=query(u<<1,l,r);
    }
    if(r>mid){
        ans+=query(u<<1|1,l,r);
        ans%=p;
    }
    return ans;
}
signed main(){
    cin>>n>>p;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    cin>>m;
    for(int i=1;i<=m;i++){
        int t,l,r,x;
        cin>>t>>l>>r;
        if(t==1){
            cin>>x;
            modify(1,l,r,0,x);
        }
        else if(t==2){
            cin>>x;
            modify(1,l,r,x,1);
        }
        else cout<<query(1,l,r)<<endl;
    }
    return 0;
}
2022/8/6 10:42
加载中...