我已经在我能模的地方全模了,还是过不了
#include<bits/stdc++.h>
#define ls tree[u*2]
#define rs tree[u*2+1]
#define ll long long
using namespace std;
const ll N=1e5*4+5;
struct node{
ll l,r,s,lzj;
ll lzc=1;
}tree[N];
ll a[N],x,y,tp,k,n,m,P;
void bt(ll u,ll x,ll y)
{
tree[u].l=x;
tree[u].r=y;
tree[u].lzj=0;
tree[u].lzc=1;
if(x==y)
{
tree[u].s=a[x]%P;
return;
}
ll mid=(x+y)>>1;
bt(u*2,x,mid);
bt(u*2+1,mid+1,y);
tree[u].s=(ls.s%P+rs.s%P)%P;
}
void addtag(ll u,ll jia,ll ch)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
jia%=P; ch%=P;
// tree[u].s*=ch; tree[u].s+=jia*(r-l+1); tree[u].s%=P;
// tree[u].lzc*=ch; tree[u].lzc%=P;
// tree[u].lzj*=ch; tree[u].lzj+=jia; tree[u].lzj%=P;
tree[u].s=tree[u].s%P*ch+((r-l+1)*jia)%P;
//tree[u].lzj*=ch; tree[u].lzj+=jia;
tree[u].lzj= (tree[u].lzj*ch)%P+jia;
tree[u].lzc= tree[u].lzc*ch;
//tree[u].s=tree[u].s*tree[u].lzc+(r-l+1)*tree[u].lzj;
tree[u].lzj%=P; tree[u].lzc%=P; tree[u].s%=P;
}
void down(ll u)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
//if(tree[u].lzj==0&&tree[u].lzc==1) return;
if(l==r) return;
addtag(u*2,tree[u].lzj,tree[u].lzc);
addtag(u*2+1,tree[u].lzj,tree[u].lzc);
tree[u].lzj=0; tree[u].lzc=1;
}
void jia(ll u,ll x,ll y,ll k)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
if(x<=l&&y>=r)
{
// tree[u].s+=k*(l-r+1); tree[u].s%=P;
// tree[u].lzj+=k; tree[u].s%=P;
addtag(u,k,1);
return;
}
down(u);
if(x<=mid){
jia(u*2,x,y,k);
}
if(y>mid){
jia(u*2+1,x,y,k);
}
tree[u].s=ls.s%P+rs.s%P;
tree[u].s%=P;
}
void cheng(ll u,ll x,ll y,ll k)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
if(x<=l&&y>=r)
{
// tree[u].s*=k; tree[u].s%=P;
// tree[u].lzc*=k; tree[u].lzc%=P;
addtag(u,0,k);
return;
}
down(u);
if(x<=mid){
cheng(u*2,x,y,k);
}
if(y>mid){
cheng(u*2+1,x,y,k);
}
tree[u].s=ls.s%P+rs.s%P;
tree[u].s%=P;
}
ll sum(ll u,ll x,ll y)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
if(x<=l&&y>=r) return tree[u].s%=P;
down(u);
ll ans=0;
if(x<=mid) ans+=sum(u*2,x,y),ans%=P;
if(y>mid) ans+=sum(u*2+1,x,y),ans%=P;
return ans%P;
}
int main()
{
cin>>n>>m>>P;
for(ll i=1;i<=n;++i)
{
cin>>a[i];
}
bt(1,1,n);
for(ll i=1;i<=n;++i)
{
cin>>tp;
switch(tp)
{
case 1:
cin>>x>>y>>k;
cheng(1,x,y,k%P);break;
case 2:
cin>>x>>y>>k;
jia(1,x,y,k%P);break;
case 3:
cin>>x>>y;
cout<<sum(1,x,y)%P<<endl;break;
}
}
}