求助,样例都过不了,大佬救救
查看原帖
求助,样例都过不了,大佬救救
1009267
gsb_888楼主2024/1/23 20:15
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define double long double

using namespace std;
typedef long long ll;
using PII = pair<int,int>;
using ull=unsigned long long;
const int N=1e6+10;
const ull base=13331;
const ull modp=212370440130137957ll;

int mod;
int a[N];

struct node{
    int l,r;
    int sum,add,mul;
}tr[N*4];

void pushup(int u){
    tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%mod;
}

void pushdown(int u){
    auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];

    left.sum=(left.sum*root.mul+(left.r-left.l+1)*root.add)%mod;
    right.sum=(right.sum*root.mul+(right.r-right.l+1)*root.add)%mod;

    left.add=(left.add*root.mul+root.add)%mod;
    right.add=(right.add*root.mul+root.add)%mod;

    left.mul=(left.mul*root.mul)%mod;
    right.mul=(right.mul*root.mul)%mod;

    root.mul=1;
    root.add=0;
}

void build(int u,int l,int r){
    if(l==r) tr[u]={l,r,a[l],0,1};
    else{
        tr[u].l=l,tr[u].r=r;
        int mid=l+r>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}

void mull(int u,int l,int r,int k){
    if(tr[u].l>=l && tr[u].r<=r){
        tr[u].mul=(tr[u].mul*k)%mod;
        tr[u].add=(tr[u].add*k)%mod;
        tr[u].sum=(tr[u].sum*k)%mod;
    }
    else{
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) mull(u<<1,l,r,k);
        if(r>mid) mull(u<<1|1,l,r,k);
        pushup(u);
    }
}

void addd(int u,int l,int r,int k){
    if(tr[u].l>=l && tr[u].r<=r){
        tr[u].add=(tr[u].add+k)%mod;
        tr[u].sum=(tr[u].sum+k*(tr[u].r-tr[u].l+1))%mod;
    }
    else{
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) addd(u<<1,l,r,k);
        if(r>mid) addd(u<<1|1,l,r,k);
        pushup(u);
    }
}

int query(int u,int l,int r){
    if(tr[u].l>=l && tr[u].r<=r){
        return tr[u].sum;
    }
    else{
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        int sum=0;
        if(l<=mid) sum=(sum+query(u<<1,l,r))%mod;
        if(r>mid) sum=(sum+query(u<<1|1,l,r))%mod;
        return sum;
    }
}

void solve(){
    int n,m;
    cin>>n>>m>>mod;

    for(int i=1;i<=n;i++) cin>>a[i];

    build(1,1,n);

    while(m--){
        int op;
        cin>>op;
        if(op==1){
            int l,r,k;
            cin>>l>>r>>k;
            mull(1,l,r,k);
        }
        else if(op==2){
            int l,r,k;
            cin>>l>>r>>k;
            addd(1,l,r,k);
        }
        else{
            int l,r;
            cin>>l>>r;
            cout<<query(1,l,r)<<endl;
        }
    }    

}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);

    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
}
2024/1/23 20:15
加载中...