Rt 好像是每次输出的时候都不会下传标记 其它时候没问题
#include<iostream>
using namespace std;
int n,m,p,s[400001],lazyTagPlus[400001],lazyTagMu[400001],ysz[100001];
void pushDown(int k,int l,int r,int mid)
{
s[k*2]=(s[k*2]*lazyTagMu[k]+lazyTagPlus[k]*(mid-l+1))%p;
s[k*2+1]=(s[k*2+1]*lazyTagMu[k]+lazyTagPlus[k]*(r-mid))%p;
lazyTagMu[k*2]=(lazyTagMu[k]*lazyTagMu[k*2])%p;
lazyTagMu[k*2+1]=(lazyTagMu[k]*lazyTagMu[k*2+1])%p;
lazyTagPlus[k*2]=(lazyTagPlus[k*2]*lazyTagMu[k]+lazyTagPlus[k])%p;
lazyTagPlus[k*2+1]=(lazyTagPlus[k*2+1]*lazyTagMu[k]+lazyTagPlus[k])%p;
lazyTagMu[k]=1;
lazyTagPlus[k]=0;
}
void build(int k,int l,int r)
{
if(l==r)
{
s[k]=ysz[l];return;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
s[k]=s[k*2]+s[k*2+1];
s[k]%=p;
}
void changePlus(int k,int l,int r,int x,int y,int v)
{
if(l>=x&&r<=y)
{
lazyTagPlus[k]=(lazyTagPlus[k]+v)%p;
s[k]=(s[k]+v*(r-l+1))%p;
return;
}
int mid=(l+r)/2;
pushDown(k,l,r,mid);
if(x<=mid) changePlus(k*2,l,mid,x,y,v);
if(y>mid) changePlus(k*2+1,mid+1,r,x,y,v);
s[k]=(s[k*2]+s[k*2+1])%p;
}
void changeMu(int k,int l,int r,int x,int y,int v)
{
if(l>=x&&r<=y)
{
lazyTagPlus[k] = (lazyTagPlus[k] * v) % p;
lazyTagMu[k] = (lazyTagMu[k] * v) % p;
s[k] = (s[k] * v) % p;
return;
}
int mid=(l+r)/2,res=0;
pushDown(k,l,r,mid);
if(x<=mid) changeMu(k*2,l,mid,x,y,v);
if(y>mid) changeMu(k*2+1,mid+1,r,x,y,v);
s[k]=(s[k*2]+s[k*2+1])%p;
}
int qHe(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y) return s[k];
int mid=(l+r)/2,res=0;
pushDown(k,l,r,mid);
if(x<=mid) res+=qHe(k,l,mid,x,y);
if(y>mid) res+=qHe(k,mid+1,r,x,y);
res%=p;
return res;
}
int main()
{
for(int i=1;i<=400000;i++) lazyTagMu[i]=1;
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
cin>>ysz[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
int pa;
cin>>pa;
if(pa==1)
{
int xx,yy,kv;
cin>>xx>>yy>>kv;
changeMu(1,1,n,xx,yy,kv);
}
if(pa==2)
{
int xx,yy,kv;
cin>>xx>>yy>>kv;
changePlus(1,1,n,xx,yy,kv);
}
if(pa==3)
{
int xx,yy;
cin>>xx>>yy;
cout<<qHe(1,1,n,xx,yy)%p<<endl;
}
/*for(int i=1;i<=9;i++)
cout<<s[i]<<" ";cout<<endl;
for(int i=1;i<=9;i++)
cout<<lazyTagMu[i]<<" ";cout<<endl;
for(int i=1;i<=9;i++)
cout<<lazyTagPlus[i]<<" ";
cout<<endl;*/
}
return 0;
}