社区讨论
WA30分,求助
P3373【模板】线段树 2参与者 4已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @mi6oekib
- 此快照首次捕获于
- 2025/11/20 08:11 4 个月前
- 此快照最后确认于
- 2025/11/20 08:27 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll w[1000000+1];
ll n,m,k1,k2,k3,k4,mark1[1000000+1],mark2[1000000+1],sum[2000000+1],p;
void wh(ll x)
{
sum[x]=(sum[2*x+1]+sum[2*x])%p;
}
void build(ll l,ll r,ll v)
{
mark1[v]=1;
if(l==r)
{
sum[v]=w[l]%p;
return;
}
ll mid=(l+r)/2;
build(l,mid,2*v);
build(mid+1,r,2*v+1);
wh(v);
}
void pushdown(ll x,ll lr,ll rr)
{
if(mark1[x]!=1&&mark1[x]!=0)
{
sum[2*x]=(mark1[x]*sum[2*x])%p;
sum[2*x+1]=(mark1[x]*sum[2*x+1])%p;
mark1[2*x]=(mark1[x]*mark1[2*x])%p;
mark1[2*x+1]=(mark1[x]*mark1[2*x+1])%p;
mark2[2*x]=(mark1[x]*mark2[2*x])%p;
mark2[2*x+1]=(mark1[x]*mark2[2*x+1])%p;
mark1[x]=1;
}
if(mark2[x]!=0)
{
sum[2*x]=(mark2[x]*lr+sum[2*x])%p;
sum[2*x+1]=(mark2[x]*rr+sum[2*x+1])%p;;
mark2[2*x]=(mark2[x]+mark2[2*x])%p;
mark2[2*x+1]=(mark2[x]+mark2[2*x+1])%p;
mark2[x]=0;
}
}
void push1(ll l,ll r,ll v,ll L,ll R,ll C)
{
if(l>=L&&r<=R)
{
sum[v]=(C*sum[v])%p;
mark1[v]=(C*mark1[v])%p;
mark2[v]=(C*mark2[v])%p;
return;
}
ll mid=(l+r)/2;
pushdown(v,mid-l+1,r-mid);
if(L<=mid)
{
push1(l,mid,2*v,L,R,C);
}
if(R>=mid+1)
{
push1(mid+1,r,2*v+1,L,R,C);
}
wh(v);
}
void push2(ll l,ll r,ll v,ll L,ll R,ll C)
{
if(l>=L&&r<=R)
{
sum[v]=(sum[v]+C*(r-l+1))%p;
mark2[v]=(C+mark2[v])%p;
return;
}
ll mid=(l+r)/2;
pushdown(v,mid-l+1,r-mid);
if(L<=mid)
{
push2(l,mid,2*v,L,R,C);
}
if(R>=mid+1)
{
push2(mid+1,r,2*v+1,L,R,C);
}
wh(v);
}
ll query(ll l,ll r,ll v,ll L,ll R)
{
if(l>=L&&r<=R)
{
return sum[v]%p;
}
ll ans=0;
ll mid=(l+r)/2;
pushdown(v,mid-l+1,r-mid);
if(L<=mid)
{
ans=(query(l,mid,2*v,L,R)+ans)%p;
}
if(R>=mid+1)
{
ans=(query(mid+1,r,2*v+1,L,R)+ans)%p;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>p;
for(ll i=1;i<=n;i++)
{
cin>>w[i];
w[i]=w[i]%p;
}
build(1,n,1);
for(ll i=1;i<=m;i++)
{
cin>>k1;
if(k1==1)
{
cin>>k2>>k3>>k4;
k4=k4%p;
push1(1,n,1,k2,k3,k4);
}
else if(k1==2)
{
cin>>k2>>k3>>k4;
k4=k4%p;
push2(1,n,1,k2,k3,k4);
}
else
{
cin>>k2>>k3;
cout<<query(1,n,1,k2,k3)<<endl;
}
}
return 0;
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...