#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 9;
int data[N] , tree[N] , flag[N] , _flag[N] , mod;
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while(c > '9' || c <'0')
{
if(c == '-')
f = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = x*10 + c - 48;
c = getchar();
}
return x*f;
}
void build(int s , int e , int p){
_flag[p] = 1;
if(s == e){
tree[p] = data[s];
return;
}
int m = s + ((e - s) >> 1);
build(s , m , p << 1);
build(m + 1 , e , (p << 1) + 1);
tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
tree[p] %= mod;
}
void pushdown(int p , int s , int m , int e){
tree[p << 1] = (tree[p << 1] * _flag[p] + flag[p] * (m - s + 1)) % mod;
tree[(p << 1) + 1] = tree[(p << 1) + 1] * _flag[p] + flag[p] * (e - m) % mod;
_flag[(p << 1)] *= _flag[p];
_flag[(p << 1)] %= mod;
_flag[(p << 1) + 1] *= _flag[p];
_flag[(p << 1) + 1] %= mod;
flag[(p << 1)] = (flag[(p << 1)] * _flag[p] + flag[p]) % mod;
flag[(p << 1) + 1] = (flag[(p << 1) + 1] * _flag[p] + flag[p]) % mod;
flag[p] = 0;
_flag[p] = 1;
}
void add(int x , int y , int s , int e , int p , int k){
if(s >= x && e <= y){
tree[p] += (e - s + 1) * k;
flag[p] += k;
return;
}
int m = s + ((e - s) >> 1);
pushdown(p , s , m , e);
if(m >= x)
add(x , y , s , m , (p << 1) , k);
if(m < y)
add(x , y , m + 1 , e , (p << 1) + 1 , k);
tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
tree[p] %= mod;
}
void mul(int x , int y , int s , int e , int p , int k){
if(s >= x && e <= y){
flag[p] = (flag[p] * k) % mod;
_flag[p] = (_flag[p] * k) % mod;
tree[p] = (tree[p] * k) % mod;
return;
}
int m = s + ((e - s) >> 1);
pushdown(p , s , m , e);
if(m >= x)
mul(x , y , s , m , (p << 1) , k);
if(m < y)
mul(x , y , m + 1 , e , (p << 1) + 1 , k);
tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
tree[p] %= mod;
}
int fin(int x , int y , int s , int e , int p){
if(s >= x && e <= y){
return tree[p];
}
int m = s + ((e - s) >> 1);
pushdown(p , m , s , e);
int val = 0;
if(m >= x)
val = (val + fin(x , y , s , m , (p << 1))) % mod;
if(m < y)
val = (val + fin(x , y , m + 1 , e , (p << 1) + 1)) % mod;
return val;
}
signed main(){
int n , m , x , y , k , opt;
n = read() , m = read() , mod = read();
for(int i = 1 ; i <= n ; i ++){
data[i] = read();
}
build(1 , n , 1);
while(m--){
opt = read() , x = read() , y = read();
if(opt == 1){
k = read();
mul(x , y , 1 , n , 1 , k);
}
else if(opt == 2){
k = read();
add(x , y , 1 , n , 1 , k);
}
else{
cout << fin(x , y , 1 , n , 1) << endl;
}
}
}