社区讨论
#2#9#10 WA多次求教!
P3373【模板】线段树 2参与者 6已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi6uaxd5
- 此快照首次捕获于
- 2025/11/20 10:56 4 个月前
- 此快照最后确认于
- 2025/11/20 10:56 4 个月前
rt.
CPP#include<bits/stdc++.h>
using namespace std;
long long mod,n,m,a[100002],f,x,y,k;
struct tree
{
long long l,r,v,ad,ti;
}t[400002];
void found(long long p,long long l,long long r)
{
t[p].l=l;
t[p].r=r;
t[p].ad=0;
t[p].ti=1;
if(t[p].l==t[p].r)
{
t[p].v=a[l];
return;
}
long long m=(l+r)/2;
found(2*p,l,m);
found(2*p+1,m+1,r);
t[p].v=(t[2*p].v+t[2*p+1].v)%mod;
return;
}
inline void push(long long p)
{
if(t[p].ad==0&&t[p].ti==0)
return;
if(t[p].l==t[p].r)
{
t[p].ad=0;
t[p].ti=0;
return;
}
t[2*p].v=(t[2*p].v*t[p].ti+(t[2*p].r-t[2*p].l+1)*t[p].ad)%mod;
t[2*p].ti=(t[2*p].ti*t[p].ti)%mod;
t[2*p].ad=(t[2*p].ad*t[p].ti+t[p].ad)%mod;
t[2*p+1].v=(t[2*p+1].v*t[p].ti+(t[2*p+1].r-t[2*p+1].l+1)*t[p].ad)%mod;
t[2*p+1].ti=(t[2*p+1].ti*t[p].ti)%mod;
t[2*p+1].ad=(t[2*p+1].ad*t[p].ti+t[p].ad)%mod;
t[p].ti=1;
t[p].ad=0;
return;
}
void add(long long p,long long l,long long r,long long w)
{
if(l<=t[p].l&&r>=t[p].r)
{
t[p].v=(t[p].v+(t[p].r-t[p].l+1)*w)%mod;
t[p].ad=(t[p].ad+w)%mod;
return;
}
push(p);
if(l<=t[2*p].r)
add(2*p,l,r,w);
if(r>=t[2*p+1].l)
add(2*p+1,l,r,w);
t[p].v=(t[2*p].v+t[2*p+1].v)%mod;
return;
}
void times(long long p,long long l,long long r,long long w)
{
if(l<=t[p].l&&r>=t[p].r)
{
t[p].v=(t[p].v*w)%mod;
t[p].ad=(t[p].ad*w)%mod;
t[p].ti=(t[p].ti*w)%mod;
return;
}
push(p);
if(l<=t[2*p].r)
times(2*p,l,r,w);
if(r>=t[2*p+1].l)
times(2*p+1,l,r,w);
t[p].v=(t[2*p].v+t[2*p+1].v)%mod;
return;
}
long long sum(long long p,long long l,long long r)
{
if(l<=t[p].l&&r>=t[p].r)
return t[p].v;
push(p);
long long val=0;
if(l<=t[2*p].r)
val=(val+sum(2*p,l,r))%mod;
if(r>=t[2*p+1].l)
val=(val+sum(2*p+1,l,r))%mod;
return val;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&mod);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
found(1,1,n);
while(m--)
{
scanf("%lld",&f);
if(f==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
times(1,x,y,k);
}
if(f==2)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
}
else if(f==3)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",sum(1,x,y)%mod);
}
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...