社区讨论

求大佬改错

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi6mc4zi
此快照首次捕获于
2025/11/20 07:13
4 个月前
此快照最后确认于
2025/11/20 07:13
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long sum[400000],add[400000],mul[400000],a[400000],n,m,x,y,k,t;
long long mod,p;
long long read()
{
    long long x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void pushup(long long rt)
{
    sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%mod;
}
void pushdown(long long rt,long long ln,long long rn)
{
//    if(add[rt]&&mul[rt]!=1)
//    {
        add[rt<<1]=(add[rt<<1]*mul[rt]+add[rt])%mod;
        add[rt<<1|1]=(add[rt<<1|1]*mul[rt]+add[rt])%mod;
        mul[rt<<1]=(mul[rt<<1]*mul[rt])%mod;
        mul[rt<<1<<1]=(mul[rt<<1|1]*mul[rt])%mod;
        sum[rt<<1]=(sum[rt<<1]*mul[rt]+add[rt]*ln)%mod;
        sum[rt<<1|1]=(sum[rt<<1|1]*mul[rt]+add[rt]*rn)%mod;
        add[rt]=0;
        mul[rt]=1;
/*    }
    else if(add[rt])
    {
        add[rt<<1]=(add[rt<<1]+add[rt])%mod;
        add[rt<<1|1]=(add[rt<<1|1]+add[rt])%mod;
        sum[rt<<1]=(sum[rt<<1]+add[rt]*ln)%mod;
        sum[rt<<1|1]=(sum[rt<<1|1]+add[rt]*rn)%mod;
        add[rt]=0;
    }
    else if(mul[rt]!=1)
    {
        mul[rt<<1]=(mul[rt<<1]*mul[rt])%mod;
        mul[rt<<1|1]=(mul[rt<<1|1]*mul[rt])%mod;
        sum[rt<<1]=(sum[rt<<1]*mul[rt])%mod;
        sum[rt<<1|1]=(sum[rt<<1|1]*mul[rt])%mod;
        mul[rt]=1;
    }*/
}
void build(long long l,long long r,long long rt)
{
    mul[rt]=1;
    if(l==r)
    {
        sum[rt]=a[l];
        return ;
    }
    long long m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    pushup(rt);
}
void update(long long L,long long R,long long c,long long l,long long r,long long rt)
{
    if(L<=l&&R>=r)
    {
        if(t==1)
        {
            sum[rt]=(sum[rt]*c)%mod;
            mul[rt]=(mul[rt]*c)%mod;
            add[rt]=(add[rt]*c)%mod; 
        }
        else
        {
            sum[rt]=(sum[rt]+c*(r-l+1))%mod;
            add[rt]=(add[rt]+c)%mod;
        }
        return ;
    }
    long long m=(l+r)>>1;
    pushdown(rt,m-l+1,r-m);
    if(L<=m)update(L,R,c,l,m,rt<<1);
    if(R>m)update(L,R,c,m+1,r,rt<<1|1);
    pushup(rt);
}
long long query(long long L,long long R,long long l,long long r,long long rt)
{
    if(L<=l&&R>=r)
    {
        return sum[rt]%mod;
    }
    long long m=(l+r)/2,ans=0;
    pushdown(rt,m-l+1,r-m);
    if(L<=m)ans+=query(L,R,l,m,rt<<1);
    if(R>m)ans+=query(L,r,m+1,r,rt<<1|1);
    return ans%mod;
}
int main()
{
    n=read(),m=read(),p=read();
    mod=p;
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
    }
    build(1,n,1);
    while(m--)
    {
        t=read();
        if(t==1||t==2)
        {
            x=read(),y=read(),k=read();    
            update(x,y,k%p,1,n,1);
        }
        else
        {
           x=read(),y=read();
           cout<<query(x,y,1,n,1)<<endl;
        }
    }
    return 0;
}

回复

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

正在加载回复...