#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 1e5 + 10;
long long t[MAX << 2];
long long la[MAX << 2];
long long lam[MAX << 2];
int n, m, mod;
inline int lson(int x){
return x << 1;
}
inline int rson(int x){
return lson(x) | 1;
}
void push_up(int p){
t[p] = (t[lson(p)] + t[rson(p)]) % mod;
}
void build(int p, int s, int e){
if(s == e){
scanf("%lld", &t[p]);
return;
}
int mid = s + ((e - s) >> 1);
build(lson(p), s, mid);
build(rson(p), mid + 1, e);
push_up(p);
}
void push_down(int p, int s, int e){
if(la[p] == 0 && lam[p] == 1){
return;
}
long long& lazy = la[p];
long long& lazym = lam[p];
int mid = s + ((e - s) >> 1);
int ls = lson(p);
int rs = rson(p);
t[ls] = (t[ls] * lazym + lazy * (mid - s + 1)) % mod;
t[rs] = (t[rs] * lazym + lazy * (e - mid)) % mod;
la[ls] = (la[ls] * lazym + lazy) % mod;
la[rs] = (la[rs] * lazym + lazy) % mod;
lam[ls] = (lam[ls] * lazy) % mod;
lam[rs] = (lam[rs] * lazy) % mod;
lazy = 0;
lazym = 1;
}
long long query(int p, int s, int e, int l, int r){
if(l <= s && e <= r){
return t[p] % mod;
}
push_down(p, s, e);
int mid = s + ((e - s) >> 1);
long long ret = 0;
if(l <= mid){
ret = (ret + query(lson(p), s, mid, l, r)) % mod;
}
if(r > mid){
ret = (ret + query(rson(p), mid + 1, e, l, r)) % mod;
}
return ret;
}
void modifya(int p, int s, int e, int l, int r, int d){
if(l <= s && e <= r){
t[p] = (t[p] + d * (e - s + 1)) % mod;
la[p] = (la[p] + d) % mod;
return;
}
push_down(p, s, e);
int mid = s + ((e - s) >> 1);
if(l <= mid){
modifya(lson(p), s, mid, l, r, d);
}
if(r > mid){
modifya(rson(p), mid + 1, e, l , r, d);
}
push_up(p);
}
void modifym(int p, int s, int e, int l, int r, int k){
if(l <= s && e <= r){
t[p] = (t[p] * k) % mod;
la[p] = (la[p] * k) % mod;
lam[p] = (lam[p] * k) % mod;
return;
}
push_down(p, s, e);
int mid = s + ((e - s) >> 1);
if(l <= mid){
modifym(lson(p), s, mid, l, r, k);
}
if(r > mid){
modifym(rson(p), mid + 1, e, l, r, k);
}
push_up(p);
}
void slove(int j){
if(1 == j){
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
modifym(1, 1, n, l, r, k);
}
else if(2 == j){
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
modifya(1, 1, n, l, r, d);
}
else if(3 == j){
int l, r;
scanf("%d%d", &l, &r);
long long ans = query(1, 1, n, l, r);
printf("%lld\n", ans);
}
}
void Init(){
build(1, 1, n);
fill(lam, lam + n * 4 + 1, 1);
}
int main(){
freopen("out.txt","w",stdout);
scanf("%d%d%d", &n, &m, &mod);
Init();
while(m--){
int me = 0;
scanf("%d", &me);
slove(me);
}
return 0;
}
水平还不到家呀,求大佬帮助。