#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 5;
long long n, m, q, l, r, k, f;
long long a[N];
struct P{
long long x, tag, tag2;
};
P s[N];
void release(int x, int l, int r){
int mid = (l + r) / 2;
s[x * 2].x = ((s[x * 2].x * s[x].tag2) % q + ((mid - l + 1) * s[x].tag) % q) % q;
s[x * 2 + 1].x = ((s[x * 2 + 1].x * s[x].tag2) % q + ((r - mid) * s[x].tag) % q) % q;
s[x * 2].tag = (s[x * 2].tag + s[x].tag) % q;
s[x * 2 + 1].tag = (s[x * 2 + 1].tag + s[x].tag) % q;
s[x * 2].tag2 = (s[x * 2].tag2 * s[x].tag2) % q;
s[x * 2 + 1].tag2 = (s[x * 2 + 1].tag2 * s[x].tag2) % q;
s[x].tag = 0, s[x].tag2 = 1;
}
void js(int x, int l, int r){
s[x].tag2 = 1;
if(l == r){
s[x].x = a[l] % q;
return;
}
int mid = (l + r) / 2;
js(x * 2, l, mid), js(x * 2 + 1, mid + 1, r);
s[x].x = (s[x * 2].x + s[x * 2 + 1].x) % q;
}
void tj1(int x, int l, int r, int ll, int rr, long long k){
if(ll <= l && r <= rr){
s[x].x = (s[x].x + (k * (r - l + 1)) % q) % q;
s[x].tag = (s[x].tag + k) % q;
return;
}
release(x, l, r);
int mid = (l + r) / 2;
if(ll <= mid) tj1(x * 2, l, mid, ll, rr, k);
if(mid < rr) tj1(x * 2 + 1, mid + 1, r, ll, rr, k);
s[x].x = (s[x * 2].x + s[x * 2 + 1].x) % q;
}
void tj2(int x, int l, int r, int ll, int rr, long long k){
if(ll <= l && r <= rr){
s[x].x = (s[x].x * k) % q;
s[x].tag2 = (s[x].tag2 * k) % q;
s[x].tag = (s[x].tag * k) % q;
return;
}
release(x, l, r);
int mid = (l + r) / 2;
if(ll <= mid) tj2(x * 2, l, mid, ll, rr, k);
if(mid < rr) tj2(x * 2 + 1, mid + 1, r, ll, rr, k);
s[x].x = (s[x * 2].x + s[x * 2 + 1].x) % q;
}
long long print(int x, int l, int r, int ll, int rr){
if(ll <= l && r <= rr){
return s[x].x % q;
}
release(x, l, r);
int mid = (l + r) / 2;
long long sum = 0;
if(ll <= mid) sum = (sum + print(x * 2, l, mid, ll, rr)) % q;
if(mid < rr) sum = (sum + print(x * 2 + 1, mid + 1, r, ll, rr)) % q;
return sum % q;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> m >> q;
for(int i = 1; i <= n; i ++){
cin >> a[i];
}
js(1, 1, n);
while(m --){
cin >> f >> l >> r;
if(f == 2){
cin >> k;
tj1(1, 1, n, l, r, k);
}
else if(f == 1){
cin >> k;
tj2(1, 1, n, l, r, k);
}
else{
cout << print(1, 1, n, l, r) % q << '\n';
}
}
return 0;
}