rt,此代码不开 O2 TLE 70pts 1.16s,问题应该不大。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int PTA=131071;
int a[300012],aaa[300012],all[300012];
int p;
int qry(int l,int r,int ii,int aa,int xb)
{
int ans=0;
while(1)
{
if(l==ii&&r==aa) return (ans+all[xb])%p;
int lmid=(ii+aa)>>1,rmid=lmid+1;
aaa[xb<<1]*=aaa[xb],all[xb<<1]*=aaa[xb];aaa[(xb<<1)+1]*=aaa[xb],all[(xb<<1)+1]*=aaa[xb];
a[xb<<1]*=aaa[xb];a[(xb<<1)+1]*=aaa[xb];aaa[xb]=1;
a[xb<<1]+=a[xb],all[xb<<1]+=(lmid-ii+1)*a[xb];a[(xb<<1)+1]+=a[xb],all[(xb<<1)+1]+=(aa-rmid+1)*a[xb];a[xb]=0;
a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p,a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;
if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
if(r<=lmid) {aa=lmid;xb<<=1;continue;}
if(ii==l) {ans+=all[xb<<1];ans%=p;ii=rmid;l=rmid;xb<<=1;xb++;continue;}
if(aa==r) {ans+=all[(xb<<1)+1];ans%=p;aa=lmid;r=lmid;xb<<=1;continue;}
return (ans+qry(l,lmid,ii,lmid,xb<<1)+qry(rmid,r,rmid,aa,(xb<<1)+1))%p;
}
}
void mdfmdf(int l,int r,int v,int ii,int aa,int xb)
{
while(1)
{
int t=qry(l,r,ii,aa,xb); // O(N * log N * log N)
all[xb]+=t*(v-1);all[xb]%=p;
if(l==ii&&r==aa) {aaa[xb]*=v;aaa[xb]%=p;a[xb]*=v;a[xb]%=p;return;}
int lmid=(ii+aa)>>1,rmid=lmid+1;
aaa[xb<<1]*=aaa[xb],all[xb<<1]*=aaa[xb];aaa[(xb<<1)+1]*=aaa[xb],all[(xb<<1)+1]*=aaa[xb];
a[xb<<1]*=aaa[xb];a[(xb<<1)+1]*=aaa[xb];aaa[xb]=1;
a[xb<<1]+=a[xb],all[xb<<1]+=(lmid-ii+1)*a[xb];a[(xb<<1)+1]+=a[xb],all[(xb<<1)+1]+=(aa-rmid+1)*a[xb];a[xb]=0;
a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p,a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;
if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
if(r<=lmid) {aa=lmid;xb<<=1;continue;}
if(ii==l) {aaa[xb<<1]*=v,a[xb<<1]*=v,all[xb<<1]*=v;a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p;ii=rmid;l=rmid;xb<<=1;xb++;continue;}
if(aa==r) {aaa[(xb<<1)+1]*=v,a[(xb<<1)+1]*=v,all[(xb<<1)+1]*=v;a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;aa=lmid;r=lmid;xb<<=1;continue;}
mdfmdf(l,lmid,v,ii,lmid,xb<<1);mdfmdf(rmid,r,v,rmid,aa,(xb<<1)+1);
break;
}
}
void mdf(int l,int r,int v,int ii,int aa,int xb)
{
while(1)
{
all[xb]+=(r-l+1)*v;all[xb]%=p;
if(l==ii&&r==aa) {a[xb]+=v;a[xb]%=p;return;}
int lmid=(ii+aa)>>1,rmid=lmid+1;
aaa[xb<<1]*=aaa[xb],all[xb<<1]*=aaa[xb];aaa[(xb<<1)+1]*=aaa[xb],all[(xb<<1)+1]*=aaa[xb];
a[xb<<1]*=aaa[xb];a[(xb<<1)+1]*=aaa[xb];aaa[xb]=1;
a[xb<<1]+=a[xb],all[xb<<1]+=(lmid-ii+1)*a[xb];a[(xb<<1)+1]+=a[xb],all[(xb<<1)+1]+=(aa-rmid+1)*a[xb];a[xb]=0;
a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p,a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;
if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
if(r<=lmid) {aa=lmid;xb<<=1;continue;}
if(ii==l) {a[xb<<1]+=v,all[xb<<1]+=(lmid-l+1)*v;a[xb<<1]%=p,all[xb<<1]%=p;ii=rmid;l=rmid;xb<<=1;xb++;continue;}
if(aa==r) {a[(xb<<1)+1]+=v,all[(xb<<1)+1]+=(r-rmid+1)*v;a[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;aa=lmid;r=lmid;xb<<=1;continue;}
mdf(l,lmid,v,ii,lmid,xb<<1);mdf(rmid,r,v,rmid,aa,(xb<<1)+1);
break;
}
}
signed main()
{
int n,m;
cin>>n>>m>>p;
for(int i=1;i<=PTA*2-1;i++)
aaa[i]=1;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
mdf(i,i,x,1,PTA+1,1);
}
for(int i=1;i<=m;i++)
{
int op,x,y,k;
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
mdfmdf(x,y,k,1,PTA+1,1);
}
else if(op==2)
{
cin>>k;
mdf(x,y,k,1,PTA+1,1);
}
else cout<<qry(x,y,1,PTA+1,1)<<endl;
}
return 0;
}