#include<bits/stdc++.h>
using namespace std;
#include<ctime>
//unordered_map
//priority_queue
/*
class fast_iostream{
private:
const int MAXBF = 1 << 20; FILE *inf, *ouf;
char *inbuf, *inst, *ined;
char *oubuf, *oust, *oued;
inline void _flush(){fwrite(oubuf, 1, oued - oust, ouf);}
inline char _getchar(){
if(inst == ined) inst = inbuf, ined = inbuf + fread(inbuf, 1, MAXBF, inf);
return inst == ined ? EOF : *inst++;
}
inline void _putchar(char c){
if(oued == oust + MAXBF) _flush(), oued = oubuf;
*oued++ = c;
}
public:
fast_iostream(FILE *_inf = stdin, FILE * _ouf = stdout)
:inbuf(new char[MAXBF]), inf(_inf), inst(inbuf), ined(inbuf),
oubuf(new char[MAXBF]), ouf(_ouf), oust(oubuf), oued(oubuf){}
~fast_iostream(){_flush(); delete inbuf; delete oubuf;}
template <typename Int>
fast_iostream& operator >> (Int &n){
static char c;
while((c = _getchar()) < '0' || c > '9');n = c - '0';
while((c = _getchar()) >='0' && c <='9') n = n * 10 + c - '0';
return *this;
}
template <typename Int>
fast_iostream& operator << (Int n){
if(n < 0) _putchar('-'), n = -n; static char S[20]; int t = 0;
do{S[t++] = '0' + n % 10, n /= 10;} while(n);
for(int i = 0;i < t;++i) _putchar(S[t - i - 1]);
return *this;
}
fast_iostream& operator << (char c){_putchar(c); return *this;}
fast_iostream& operator << (const char *s){
for(int i = 0;s[i];++i) _putchar(s[i]); return *this;
}
}lly;*/
const int N=1e6+10;
const long long MAX=1e18+17;
typedef unsigned long long ull;
#define ll long long
#define ri register
#define il inline
#define lowbit(x) x&-x
#define R(x) x<<1|1
#define L(x) x<<1
#define fson 1,n,1
#define lson l,mid,L(k)
#define rson mid+1,r,R(k)
long long p;
int n,m;
int fir[N];
struct sty{
int l,r;
ll tag,tags;
ll num;
sty(){
l=0;
r=0;
tag=0;
num=0;
tags=1;
}
void init(int x,int y){
l=x;
r=y;
num=fir[x]%p;
return;
}
}xtr[5*N];
sty operator+(const sty &x,const sty &y){
sty z;
z.l=x.l;
z.r=y.r;
z.num=(x.num+y.num)%p;
return z;
}
il void push_up(int k){
xtr[k]=xtr[L(k)]+xtr[R(k)];
return ;
}
il void build(int l,int r,int k){
if(l==r){
xtr[k].init(l,r);
return ;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
push_up(k);
return ;
}
il void update(int k,ll x){
xtr[k].num+=(xtr[k].r-xtr[k].l+1)*x%p;
xtr[k].tag+=x;
return ;
}
il void update_(int k,ll x){
xtr[k].num=xtr[k].num*x%p;
xtr[k].tags*=x;
return ;
}
il void update__(int k,ll x,ll xy){
xtr[k].num=((xtr[k].num+(xtr[k].r-xtr[k].l+1)*x)%p+xtr[k].num*xy%p)%p;
xtr[k].tag+=x;
xtr[k].tags*=x;
//printf("%d %lld %lld %lld\n",k,xtr[k].num,x,xy);
return ;
}
il void push_down(int k){
update__(L(k),xtr[k].tag,xtr[k].tags);
update__(R(k),xtr[k].tag,xtr[k].tags);
xtr[k].tag=0;
xtr[k].tags=1;
return ;
}
il void modify(int l,int r,int k,int ls,int rs,ll x){
if(ls<=l and r<=rs){
update(k,x);
return ;
}
push_down(k);
int mid=(l+r)>>1;
if(ls<=mid){
modify(lson,ls,rs,x);
}
if(mid<rs){
modify(rson,ls,rs,x);
}
push_up(k);
return ;
}
il void modify_(int l,int r,int k,int ls,int rs,ll x){
if(ls<=l and r<=rs){
update_(k,x);
return ;
}
push_down(k);
int mid=(l+r)>>1;
if(ls<=mid){
modify(lson,ls,rs,x);
}
if(mid<rs){
modify(rson,ls,rs,x);
}
push_up(k);
return ;
}
il sty query(int l,int r,int k,int ls,int rs){
if(ls<=l and r<=rs){
return xtr[k];
}
push_down(k);
int mid=(l+r)>>1;
if(ls<=mid){
if(mid<rs){
return query(lson,ls,rs)+query(rson,ls,rs);
}
else {
return query(lson,ls,rs);
}
}
else return query(rson,ls,rs);
}
signed main(){
scanf("%d%d%lld",&n,&m,&p);
for(int i=1;i<=n;i++){
scanf("%d",&fir[i]);
}
build(fson);
ll x,y;/*
for(int jj=1;jj<=n<<2;jj++){
printf("%d %d %d %lld %lld %lld\n",jj,xtr[jj].l,xtr[jj].r,xtr[jj].tag,xtr[jj].tags,xtr[jj].num);
}cout<<endl;*/
for(int i=1,op,l,r;i<=m;i++){
//cout<<"!!!!\n";
scanf("%d",&op);
if(op==1){
scanf("%d%d%lld",&l,&r,&x);
modify_(fson,l,r,x);
}else if(op==2){
scanf("%d%d%lld",&l,&r,&x);
modify(fson,l,r,x);
}else{
scanf("%d%d",&l,&r);
printf("%lld\n",query(fson,l,r).num%p);
}/*
for(int jj=1;jj<=n;jj++){
printf("%lld ",query(fson,jj,jj).num);
}cout<<endl;
for(int jj=1;jj<=n<<2;jj++){
printf("%d %d %d %lld %lld %lld\n",jj,xtr[jj].l,xtr[jj].r,xtr[jj].tag,xtr[jj].tags,xtr[jj].num);
}cout<<endl;*/
}
return 0;
}
找了一下午没找出来错/kk