#include <iostream>
using namespace std;
const int N=1e5+5;
int n,m,mod,a[N],op,x,y,k;
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
template<class T=long long>
class SgT{
public:
SgT(int rt=-1,int l=0,int r=0,T *_a=nullptr):a_res(new T[N]),a(_a==nullptr ? a_res : _a){
for(int i=0; i<N; i++){
a_res[i]=0;
}
if(rt!=-1) build(rt,l,r);
}
void build(int rt,int l,int r){
t[rt].l=l,t[rt].r=r;
t[rt].mul=1,t[rt].add=0;
if(l==r){
t[rt].v=a[l];
return;
}
int mid=l+r>>1;
build(ls(rt),l,mid);
build(rs(rt),mid+1,r);
pushup(rt);
}
void update_mul(int rt,int l,int r,T v){
if(l<=t[rt].l && t[rt].r<=r){
t[rt].v=(t[rt].v*v)%mod;
t[rt].mul=(t[rt].mul*v)%mod;
t[rt].add=(t[rt].add*v)%mod;
return;
}
pushdown(rt);
int mid=t[rt].l+t[rt].r>>1;
if(l<=mid) update_mul(ls(rt),l,r,v);
if(r>mid) update_mul(rs(rt),l,r,v);
pushup(rt);
}
void update_add(int rt,int l,int r,T v){
if(l<=t[rt].l && t[rt].r<=r){
t[rt].add=(t[rt].add+v)%mod;
t[rt].v=(t[rt].v+(t[rt].r-t[rt].l+1)*v)%mod;
return;
}
pushdown(rt);
int mid=t[rt].l+t[rt].r>>1;
if(l<=mid) update_add(ls(rt),l,r,v);
if(r>mid) update_add(rs(rt),l,r,v);
pushup(rt);
}
T query(int rt,int l,int r){
if(l<=t[rt].l && t[rt].r<=r){
return t[rt].v;
}
pushdown(rt);
T res=0;
int mid=t[rt].l+t[rt].r>>1;
if(l<=mid) res+=query(ls(rt),l,r);
if(r>mid) res+=query(rs(rt),l,r);
return res%mod;
}
private:
T *a,*a_res;
struct node{
int l,r;
T v,mul,add;
}t[N<<2];
inline int ls(int rt){return rt<<1;}
inline int rs(int rt){return rt<<1|1;}
inline void pushup(int rt){
t[rt].v=(t[ls(rt)].v+t[rs(rt)].v)%mod;
}
inline void pushdown(int rt){
t[ls(rt)].v=(t[ls(rt)].v*t[rt].mul+t[rt].add*(t[ls(rt)].r-t[ls(rt)].l+1))%mod;
t[rs(rt)].v=(t[rs(rt)].v*t[rt].mul+t[rt].add*(t[rs(rt)].r-t[rs(rt)].l+1))%mod;
t[ls(rt)].mul=(t[ls(rt)].mul*t[rt].mul)%mod;
t[rs(rt)].mul=(t[rs(rt)].mul*t[rt].mul)%mod;
t[ls(rt)].add=(t[ls(rt)].add*t[rt].mul+t[rt].add)%mod;
t[rs(rt)].add=(t[rs(rt)].add*t[rt].mul+t[rt].add)%mod;
t[rt].mul=1;
t[rt].add=0;
}
};
int main(){
n=read(),m=read(),mod=read();
for(int i=1; i<=n; i++){
a[i]=read();
}
SgT t(1,1,n,a);
while(m--){
op=read();
if(op==1){
x=read(),y=read(),k=read();
t.update_mul(1,x,y,k);
}else if(op==2){
x=read(),y=read(),k=read();
t.update_add(1,x,y,k);
}else{
x=read(),y=read();
write(t.query(1,x,y));
}
}
return 0;
}
rt,30pts,调了一天了,救救蒟蒻吧 QwQ