社区讨论
求大佬改错
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 条回复,欢迎继续交流。
正在加载回复...