已查明为懒标记的问题,求条。
马蜂一坨,为了您的身体健康不建议久看。
#include<bits/stdc++.h>
using namespace std;
struct node{
long long l,r,num;
long long sum,tagplus,tagmult;
}tree[800001];
long long n,m,mod,a[100001];
long long build(long long l,long long r,long long s)
{
tree[s].num=s;tree[s].l=l;tree[s].r=r;tree[s].tagmult=1;
if(l==r)
{
tree[s].sum=a[l];
return a[l];
}
long long mid=(l+r)/2;
build(l,mid,s*2);build(mid+1,r,s*2+1);
tree[s].sum=tree[s*2].sum+tree[s*2+1].sum;
return tree[s].sum;
}
void pplus(long long l,long long r,long long sum,long long s)
{
if(tree[s].l>r||tree[s].r<l)
return ;
if(tree[s].l>=l&&tree[s].r<=r)
{
(tree[s].sum+=((sum*(tree[s].r-tree[s].l+1))))%=mod;
(tree[s].tagplus+=sum)%=mod;
return ;
}
pplus(l,r,sum,s*2);pplus(l,r,sum,s*2+1);
tree[s].sum=(tree[s*2].sum+tree[s*2+1].sum)%mod;
}
void mmult(long long l,long long r,long long sum,long long s)
{
if(tree[s].l>r||tree[s].r<l)
return ;
if(tree[s].l>=l&&tree[s].r<=r)
{
(tree[s].sum*=sum)%=mod;
(tree[s].tagmult*=sum)%=mod;
(tree[s].tagplus*=sum)%=mod;
return ;
}
mmult(l,r,sum,s*2);mmult(l,r,sum,s*2+1);
tree[s].sum=(tree[s*2].sum+tree[s*2+1].sum)%mod;
}
long long fun(long long l,long long r,long long s)
{
if(tree[s].l>r||tree[s].r<l)
return 0;
if(tree[s].l>=l&&tree[s].r<=r)
return tree[s].sum;
if(tree[s].tagmult!=1)
{
(tree[s*2].sum*=tree[s].tagmult)%=mod;(tree[s*2+1].sum*=tree[s].tagmult)%=mod;
(tree[s*2].tagmult*=tree[s].tagmult)%=mod;(tree[s*2+1].tagmult*=tree[s].tagmult)%=mod;
(tree[s*2].tagplus*=tree[s].tagmult)%=mod;(tree[s*2+1].tagplus*=tree[s].tagmult)%=mod;
tree[s].tagmult=1;
}
if(tree[s].tagplus!=0)
{
(tree[s*2].sum+=(tree[s].tagplus*(tree[s*2].r-tree[s*2].l+1)))%=mod;(tree[s*2+1].sum+=(tree[s].tagplus*(tree[s*2+1].r-tree[s*2+1].l+1)))%=mod;
(tree[s*2].tagplus+=tree[s].tagplus)%=mod;(tree[s*2+1].tagplus+=tree[s].tagplus)%=mod;
tree[s].tagplus=0;
}
long long sum=0;
(sum+=fun(l,r,s*2))%=mod;
(sum+=fun(l,r,s*2+1))%=mod;
return sum;
}
int main()
{
cin>>n>>m>>mod;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++)
{
long long op,x,y,z;
cin>>op>>x>>y;
if(op==3)
cout<<fun(x,y,1)<<endl;
else
{
cin>>z;
z%=mod;
if(op==2)
pplus(x,y,z,1);
if(op==1)
mmult(x,y,z,1);
}
cout<<endl<<i<<"!!!\n";
for(int j=1;j<=2*n;j++)
cout<<tree[j].l<<" "<<tree[j].r<<" "<<tree[j].sum<<" "<<tree[j].tagmult<<" "<<tree[j].tagplus<<endl;
cout<<endl<<endl;
}
return 0;
}