#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int s = 0, f = 1;
char c = 0;
while(c < '0' || c > '9'){if(c == '-') f *= -1; c = getchar();}
while(c >= '0' && c <= '9'){s = s * 10 + c - '0'; c = getchar();}
return s * f;
}
struct _Tree{
int l, r;
ll add;
ll times = 1;
ll sum;
}tree[100010<<2];
ll init[100010];
void push_up(int rt){
tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
}
void push_down(int rt){
if(tree[rt].times != 1){
tree[rt << 1].sum *= tree[rt].times;
tree[rt << 1].times *= tree[rt].times;
tree[rt << 1 | 1].sum *= tree[rt].times;
tree[rt << 1 | 1].times *= tree[rt].times;
tree[rt].times = 1;
}
if(tree[rt].add != 0){
tree[rt << 1].sum += tree[rt].add * (tree[rt << 1].r - tree[rt << 1].l + 1);
tree[rt << 1].add += tree[rt].add;
tree[rt << 1 | 1].sum += tree[rt].add * (tree[rt << 1 | 1].r - tree[rt << 1 | 1].l + 1);
tree[rt << 1 | 1].add += tree[rt].add;
tree[rt].add = 0;
}
}
void add(int rt, int l, int r, ll a){
if(tree[rt].l > r || tree[rt].r < l){
return;
}
if(tree[rt].l >= l && tree[rt].r <= r){
tree[rt].sum += a * (tree[rt].r - tree[rt].l + 1);
tree[rt].add += a;
return;
}
push_down(rt);
int mid = ((tree[rt].l + tree[rt].r) >> 1);
add(rt << 1, l, mid, a);
add(rt << 1 | 1, mid + 1 , r, a);
push_up(rt);
}
void times(int rt, int l, int r, ll a){
if(tree[rt].l > r || tree[rt].r < l){
return;
}
if(tree[rt].l >= l && tree[rt].r <= r){
tree[rt].sum *= a;
tree[rt].times *= a;
tree[rt].add *= a;
return;
}
push_down(rt);
int mid = ((tree[rt].l + tree[rt].r) >> 1);
times(rt << 1, l, r, a);
times(rt << 1 | 1, l, r, a);
push_up(rt);
}
ll q(int rt, int l, int r){
if(tree[rt].l > r || tree[rt].r < l){
return 0;
}
if(tree[rt].l == tree[rt].r){
return tree[rt].sum;
}
push_down(rt);
return q(rt << 1, l, r) + q(rt << 1 | 1, l, r);
}
void build(int rt, int l, int r){
tree[rt].l = l;
tree[rt].r = r;
if(l == r){
tree[rt].sum = init[l];
return;
}
int mid = (l + r) / 2;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
push_up(rt);
}
int main(){
int n = read(), m = read(), mod = read();
for(int i=1;i<=n;i++){
init[i] = read();
}
build(1, 1, n);
for(int i=1;i<=m;i++){
int mode = read(), x = read(), y = read();
if(mode == 1){
ll a = read();
times(1, x, y, a);
}
else if(mode == 2){
ll a = read();
add(1, x, y, a);
}
else if(mode == 3){
cout<<q(1, x, y) % mod<<endl;
}
}
return 0;
}