社区讨论

30pts求助,玄关,良好马蜂

P3373【模板】线段树 2参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjl9texz
此快照首次捕获于
2025/12/25 17:59
2 个月前
此快照最后确认于
2025/12/27 16:30
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define ls i<<1
#define rs i<<1|1
using namespace std;
const int N=1e5+10;
int n,q,m,x,y,k,a[N];
char c;
struct Q{
    int l,r,sum,tag1,tag2;
}t[N<<2];
inline void mod(int x){x%=m;}
inline void up(int i){t[i].sum=(t[ls].sum+t[rs].sum)%m;}
inline void spread(int i){
    t[ls].sum=t[ls].sum*t[i].tag1+(t[ls].r-t[ls].l+1)*t[i].tag2;
    t[rs].sum=t[rs].sum*t[i].tag1+(t[rs].r-t[rs].l+1)*t[i].tag2;
    mod(t[ls].sum),mod(t[rs].sum);
    t[ls].tag1*=t[i].tag1;
    t[rs].tag1*=t[i].tag1;
    mod(t[ls].tag1),mod(t[rs].tag1);
    t[ls].tag2=t[ls].tag2*t[i].tag1+t[i].tag2;
    t[rs].tag2=t[rs].tag2*t[i].tag1+t[i].tag2;
    mod(t[ls].tag2),mod(t[rs].tag2);
    t[i].tag1=1,t[i].tag2=0;
}inline void build(int i,int l,int r){
    t[i].l=l;t[i].r=r;
    t[i].tag1=1,t[i].tag2=0;
    if(l==r){
        t[i].sum=a[l];
        return;
    }int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    up(i);
}inline void change1(int i,int l,int r,int k){
    if(l<=t[i].l&&t[i].r<=r){
        t[i].sum*=k;
        mod(t[i].sum);
        t[i].tag1*=k;
        mod(t[i].tag1);
        t[i].tag2*=k;
        mod(t[i].tag2);
        return;
    }spread(i);
    int mid=(t[i].l+t[i].r)>>1;
    if(l<=mid) change1(ls,l,r,k);
    if(r>mid) change1(rs,l,r,k);
    up(i);
}inline void change2(int i,int l,int r,int k){
    if(l<=t[i].l&&t[i].r<=r){
        t[i].sum+=(t[i].r-t[i].l+1)*k;
        mod(t[i].sum);
        t[i].tag2+=k;
        mod(t[i].tag2);
        return;
    }spread(i);
    int mid=(t[i].l+t[i].r)>>1;
    if(l<=mid) change2(ls,l,r,k);
    if(r>mid) change2(rs,l,r,k);
    up(i);
}inline int ask(int i,int l,int r){
    if(l<=t[i].l&&t[i].r<=r)
        return t[i].sum%m;
    spread(i);
    int ans=0,mid=(t[i].l+t[i].r)>>1;
    if(l<=mid) ans=(ans+ask(ls,l,r))%m;
    if(r>mid) ans=(ans+ask(rs,l,r))%m;
    return ans%m;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr);cout.tie(nullptr);
    cin>>n>>q>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mod(a[i]);
    }
    build(1,1,n);
    while(q--){
        cin>>c;
        if(c=='1'){
            cin>>x>>y>>k;
            change1(1,x,y,k);
        }else if(c=='2'){
            cin>>x>>y>>k;
            change2(1,x,y,k);
        }else{
            cin>>x>>y;
            cout<<ask(1,x,y)<<endl;
        }
    }
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...