帮帮孩子,求调,7个点re了
#include<bits/stdc++.h>
#define ls(o) (o << 1)
#define rs(o) (o << 1 | 1)
using namespace std;
const long long maxn = 10000010;
long long p;
long long d[maxn*6],tagp[maxn*6],tagm[maxn*6],a[maxn*6];
void update(long long o,long long l,long long r){
long long mid = (l + r) >> 1;
if(tagm[o] != 1){
tagm[ls(o)] *= tagm[o];
tagm[ls(o)] %= p;
tagm[rs(o)] *= tagm[o];
tagm[rs(o)] %= p;
tagp[ls(o)] *= tagm[o];
tagp[ls(o)] %= p;
tagp[rs(o)] *= tagm[o];
tagp[rs(o)] %= p;
d[ls(o)] *= tagm[o];
d[ls(o)] %= p;
d[rs(o)] *= tagm[o];
d[rs(o)] %= p;
tagm[o] = 1;
}
if(tagp[o]){
d[ls(o)] += (mid - l + 1) * tagp[o];
d[ls(o)] %= p;
d[rs(o)] += (r - mid) * tagp[o];
d[rs(o)] %= p;
tagp[ls(o)] += tagp[o];
tagp[ls(o)] %= p;
tagp[rs(o)] += tagp[o];
tagp[rs(o)] %= p;
tagp[o] = 0;
}
return;
}
void build(long long o,long long l,long long r){
tagm[o] = 1;
if(l == r){
d[o] = a[r];
return;
}
long long mid = (l + r) >> 1;
build(ls(o),l,mid);
build(rs(o),mid+1,r);
d[o] = (d[ls(o)] + d[rs(o)]) % p;
}
void Mul(long long l,long long r,long long c,long long s,long long t,long long o){
long long mid = (s + t) >> 1;
if(l <= s && t <= r){
d[o] *= c;
d[o] %= p;
tagm[o] *= c;
tagm[o] %= p;
tagp[o] *= c;
tagp[o] %= p;
return;
}
update(o,s,t);
if(l <= mid) Mul(l,r,c,s,mid,ls(o));
if(r > mid) Mul(l,r,c,mid+1,r,rs(o));
d[o] = (d[ls(o)] + d[rs(o)]) % p;
}
void Plus(long long l,long long r,long long c,long long s,long long t,long long o){
long long mid = (s + t) >> 1;
if(l <= s && t <= r){
d[o] += (t - s + 1) * c;
d[o] %= p;
tagp[o] += c;
tagp[o] %= p;
return;
}
update(o,s,t);
if(l <= mid) Plus(l,r,c,s,mid,ls(o));
if(r > mid) Plus(l,r,c,mid+1,t,rs(o));
d[o] = (d[ls(o)] + d[rs(o)]) % p;
}
long long Query(long long l,long long r,long long s,long long t,long long o){
long long mid = (s + t) >> 1;
if(l <= s && t <= r) return d[o];
update(o,s,t);
long long tmp = 0;
if(l <= mid) tmp += Query(l,r,s,mid,ls(o));
tmp %= p;
if(r > mid) tmp += Query(l,r,mid+1,t,rs(o));
return tmp % p;
}
int main()
{
long long n,m;
cin>>n>>m>>p;
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(long long i=1;i<=m;i++){
long long opt,x,y,k;
scanf("%lld",&opt);
if(opt == 1){
scanf("%lld %lld %lld",&x,&y,&k);
Mul(x,y,k,1,n,1);
}
else if(opt == 2){
scanf("%lld %lld %lld",&x,&y,&k);
Plus(x,y,k,1,n,1);
}
else if(opt == 3){
scanf("%lld %lld",&x,&y);
cout<<Query(x,y,1,n,1)<<endl;
}
}
return 0;
}