#include<bits/stdc++.h>
using namespace std;
long long n, m, p, a[500005], ans;
struct node{
long long l, r, sum, lazy, mu = 1;
}f[2000005];
void get(int l, int r, int id){
f[id].l = l, f[id].r = r;
if(l == r){
f[id].sum = a[l];
return;
}
int mid = l + (r - l) / 2;
get(l, mid, id * 2);
get(mid + 1, r, id * 2 + 1);
f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
}
void add(int l, int r, int k, int id){
//cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
if(l == f[id].l && r == f[id].r){
f[id].lazy += k;
return;
}
f[id].sum += k * (r - l + 1);
if(r <= f[id * 2].r)
add(l, r, k, id * 2);
else
if(l >= f[id * 2 + 1].l)
add(l, r, k, id * 2 + 1);
else
add(l, f[id * 2].r, k, id * 2), add(f[id * 2 + 1].l, r, k, id * 2 + 1);
}
void mul(int l, int r, int k, int id){
f[id].lazy *= k;
if(l == f[id].l && r == f[id].r){
f[id].mu *= k;
f[id].lazy *= k;
f[id].sum *= k;
//cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
return;
}
if(r <= f[id * 2].r)
mul(l, r, k, id * 2);
else
if(l >= f[id * 2 + 1].l)
mul(l, r, k, id * 2 + 1);
else
mul(l, f[id * 2].r, k, id * 2), mul(f[id * 2 + 1].l, r, k, id * 2 + 1);
f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
//cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
}
void find(int l, int r, int id){
//cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
if(f[id].l == l && f[id].r == r){
ans += f[id].sum * f[id].mu + f[id].lazy * (r - l + 1);
return;
}
f[id].sum += f[id].lazy * (f[id].r - f[id].l + 1);
f[id].sum *= f[id].mu;
f[id * 2].lazy += f[id].lazy, f[id * 2 + 1].lazy += f[id].lazy, f[id].lazy = 0;
f[id * 2].mu *= f[id].mu, f[id * 2 + 1].mu *= f[id].mu, f[id].mu = 1;
if(r <= f[id * 2].r)
find(l, r, id * 2);
else
if(l >= f[id * 2 + 1].l)
find(l, r, id * 2 + 1);
else
find(l, f[id * 2].r, id * 2), find(f[id * 2 + 1].l, r, id * 2 + 1);
}
int main(){
cin>>n>>m>>p;
for(int i = 1;i <= n;i++)
scanf("%d", &a[i]);
get(1, n, 1);
for(int i = 1;i <= m;i++){
int op, x, y, k;
cin>>op>>x>>y;
if(op == 1)
cin>>k, mul(x, y, k, 1);
if(op == 2)
cin>>k, add(x, y, k, 1);
if(op == 3){
ans = 0;
find(x, y, 1);
cout<<ans % p<<endl;
}
}
return 0;
}