不知错在哪,麻烦大佬指点
#include<bits/stdc++.h>
using namespace std;
const int N=1e7 + 100;
typedef long long LL;
LL read()
{
LL f=1,w=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
w=w*10+ch-'0';
ch=getchar();
}
return f*w;
}
void print(LL x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)print(x/10);
putchar(x%10+'0');
}
struct node{
LL l,r;
LL sum,add,add2;
}tr[N * 4];
LL a[N];
LL n,m,p;
void pushup(LL u){
tr[u].sum =(tr[u << 1].sum % p + tr[u<<1 | 1].sum % p) % p;
}
void pushdown(LL u){
auto &t=tr[u],&l=tr[u << 1],&r=tr[u << 1 | 1];
l.sum =(l.sum % p * t.add2 % p) % p + ((l.r - l.l +1) % p* t.add % p);
r.sum =(r.sum % p * t.add2 % p) % p + ((r.r - r.l + 1) % p * t.add % p);
l.sum %=p;r.sum %=p;
r.add2 *=(t.add2 % p);
r.add2 %=p;
l.add2 *=(t.add2 %p);
l.add2 %=p;
r.add +=(t.add % p);r.add %=p;
l.add +=(t.add % p);l.add %=p;
t.add =0;t.add2=1;
}
void build(LL u,LL l,LL r){
if(l == r) tr[u] = {l,r,a[l] % p,0,1};
else{
tr[u]={l,r};
tr[u].add2 = 1;
LL mid =l + r >> 1;
build(u << 1,l,mid);build(u << 1 | 1,mid + 1,r);
pushup(u);}
}
void modefy1(LL u,LL l,LL r,LL d){
if(tr[u].l >=l && tr[u].r <= r){
tr[u].sum += (LL)(tr[u].r - tr[u].l + 1) * d % p;
tr[u].sum %=p;
tr[u].add +=d % p;
tr[u].add %=p;
}
else{
pushdown(u);
pushup(u);
LL mid = tr[u].l + tr[u].r >> 1;
if(l <=mid) modefy1(u<<1,l,r,d);
if(r > mid) modefy1(u <<1 | 1,l,r,d);
pushup(u);}
}
void modefy2(LL u,LL l,LL r,LL d){
if(tr[u].l >=l && tr[u].r <= r){
tr[u].add *=d % p;
tr[u].add %=p;
tr[u].sum *=d % p;
tr[u].sum %=p;
tr[u].add2 *=d % p;
tr[u].add2 %=p;
}
else{
pushdown(u);
pushup(u);
LL mid = tr[u].l + tr[u].r >> 1;
if(l <=mid) modefy2(u<<1,l,r,d);
if(r > mid) modefy2(u <<1 | 1,l,r,d);
pushup(u);}
}
LL query(LL u,LL l,LL r){
if(tr[u].l >=l && tr[u].r <=r){
return tr[u].sum % p;
}
LL mid = tr[u].l + tr[u].r >> 1;
pushdown(u);
LL sum=0;
if(l <=mid) sum+=query(u << 1,l,r) % p;
sum %=p;
if(r > mid) sum+=query(u << 1 | 1,l,r) % p;
sum %=p;
return sum % p;
}
int main(){
n=read();m=read();p=read();
//p=571373;
for(int i=1;i<=n;i++) a[i] = read();
build(1,1,n);
while(m -- ){
int x;
scanf("%d",&x);
if(x == 1){
LL ll,rr,dd;
ll=read();rr=read();dd=read();
modefy2(1,ll,rr,dd);
}
else if(x == 2){
LL ll,rr,dd;
ll=read();rr=read();dd=read();
modefy1(1,ll,rr,dd);
}
else if(x == 3){
LL ll,rr;
ll=read();rr=read();
print(query(1,ll,rr) % p);
putchar('\n');
}
}
}