注:jntmtp2特判乘法;jntmtp1特判加法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, p;
ll a[2000005];
struct node{
ll l, r;
ll sum, lazy, lazy2;
}b[4000005];
void buld(ll l, ll r, ll shit){
b[shit].l = l;
b[shit].r = r;
if(l == r){
b[shit].sum = a[l];
return;
}
ll medium = (l+r)>>1;
buld(l, medium, shit*2);
buld(medium+1, r, shit*2+1);
b[shit].sum = [shit*2].sum+b[shit*2+1].sum;
return;
}
void jntmtp(ll shit){
if(b[shit].lazy){
b[shit*2].sum += b[shit].lazy*(b[shit*2].r-b[shit*2].l+1);
b[shit*2+1].sum += b[shit].lazy*(b[shit*2+1].r-b[shit*2+1].l+1);
b[shit*2].lazy += b[shit].lazy;
b[shit*2+1].lazy += b[shit].lazy;
b[shit].lazy = 0;
}
return;
}
void jntmtp2(ll shit){
if(b[shit].lazy2){
b[shit*2].sum *= b[shit].lazy2*(b[shit*2].r-b[shit*2].l+1);
b[shit*2+1].sum *= b[shit].lazy2*(b[shit*2+1].r-b[shit*2+1].l+1);
b[shit*2].lazy2 *= b[shit].lazy2;
b[shit*2+1].lazy2 *= b[shit].lazy2;
b[shit*2].lazy *= b[shit].lazy2;
b[shit*2+1].lazy *= b[shit].lazy2;
b[shit].lazy2 = 0;
}
return;
}
void jntmjf(ll shit, ll ji, ll ni, ll tai){
if(ji<=b[shit].l&&ni>=b[shit].r){
b[shit].sum+=(tai*(b[shit].r-b[shit].l+1))%p;
b[shit].lazy+=tai;
b[shit].lazy%=p;
return;
}
jntmtp(shit);
ll medium = (b[shit].l+b[shit].r)>>1;
if(ji<=medium){
jntmjf(shit*2, ji, ni, tai);
}
if(ni>medium){;
jntmjf(shit*2+1, ji, ni, tai);
}
b[shit].sum = b[shit*2].sum+b[shit*2+1].sum;
}
void jntmcf(ll shit, ll ji, ll ni, ll tai){
if(ji<=b[shit].l&&ni>=b[shit].r){
b[shit].sum*=(tai*(b[shit].r-b[shit].l+1)%p);
b[shit].sum%=p;
b[shit].lazy2*=tai;
b[shit].lazy2%=p;
return;
}
jntmtp2(shit);
ll medium = (b[shit].l+b[shit].r)>>1;
if(ji<=medium){
jntmcf((shit*2)%p, ji, ni, tai);
}
if(ni>medium){;
jntmcf((shit*2+1)%p, ji, ni, tai);
}
b[shit].sum = b[shit*2].sum+b[shit*2+1].sum;
}
ll jntmqh(ll shit, ll ji, ll ni){
if(ji<=b[shit].l&&ni>=b[shit].r){
return b[shit].sum;
}
jntmtp(shit);
ll medium = (b[shit].l+b[shit].r)>>1;
ll ans = 0;
if(ji<=medium){
ans+=jntmqh((shit*2)%p, ji, ni);
}
if(ni>medium){
ans+=jntmqh((shit*2+1)%p, ji, ni);
}
return ans;
}
int main(){
cin>>n>>m>>p;
for (ll i=1;i<=n;i++){
cin>>a[i];
}
buld(1,n,1);
for (ll i=1;i<=m;i++){
ll heizi, ji, ni, tai;
cin>>heizi;
if(heizi == 2){
cin>>ji>>ni>>tai;
jntmjf(1, ji, ni, tai);
}
if(heizi == 3){
cin>>ji>>ni;
cout<<jntmqh(1, ji, ni)%p<<endl;
}
if(heizi == 1){
cin>>ji>>ni>>tai;
jntmcf(1, ji, ni, tai);
}
}
return 0;
}