样例数据,下载的数据本地DEVC++都跑过了,洛谷全部RE,
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (now<<1)
#define rs ((now<<1)|1)
#define mid ((l+r)>>1)
#define rd(i) scanf("%lld",&i)
#define pf(i) printf("%lld",i)
#define ed(i) printf("\n")
#define up(now) sum[now]=sum[ls]+sum[rs]
int n,q,mod,opt,x,y,z;
ll sum[400005],la[400005],lm[400005];
void add(ll&x,ll y) {x=(x+y)%mod;}
void mul(ll&x,ll y) {x=(x*y)%mod;}
void build(int now,int l,int r)
{
lm[now] = 1;
if(l==r)
{
rd(sum[now]);
return;
}
build(ls,l,mid);build(rs,mid+1,r);
up(now);
}
void change(int now,ll addx,ll mulx,int l,int r)
{
mul(la[now],mulx);
add(la[now],addx);
mul(lm[now],mulx);
mul(sum[now],mulx);
add(sum[now],addx*(r-l+1));
}
void push_down(int now,int l,int r)
{
change(ls,la[now],lm[now],l,mid);
change(rs,la[now],lm[now],mid+1,r);
la[now]=0;
lm[now]=1;
}
void modify(int now,int l,int r,int L,int R,ll addx,ll mulx)
{
if(L<=l&&r<=R)
{
change(now,addx,mulx,l,r);
return;
}
push_down(now,l,r);
if(L<=mid) modify(ls,l,mid,L,R,addx,mulx);
if(mid<R) modify(rs,mid+1,r,L,R,addx,mulx);
up(now);
}
ll query(int now,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return sum[now];
ll ans=0;
push_down(now,l,r);
if(L<=mid) add(ans,query(ls,l,mid,L,R));
if(mid<R) add(ans,query(rs,mid+1,r,L,R));
return ans;
}
void work()
{
rd(n);rd(q);rd(mod);
build(1,1,n);
while(q--)
{
rd(opt);
if(opt==1)
{
rd(x);rd(y);rd(z);
modify(1,1,n,x,y,0,z);
}
else if (opt==2)
{
rd(x);rd(y);rd(z);
modify(1,1,n,x,y,z,1);
}
else
{
rd(x);rd(y);
pf(query(1,1,n,x,y));
ed();
}
}
}
int main() {work();}