#include <iostream>
#define BZHZS puts("BZH is a handsome boy");
#define ll long long
using namespace std;
struct node
{
ll k, b;
};
const int N = 100010;
node tag[4 * N];
ll sum[4 * N], a[N];
ll mod, kk;
int n, m, c, xx, yy;
void build(int x, int l, int r)
{
tag[x].k = 1;
tag[x].b = 0;
if (l == r)
{
sum[x] = a[l] % mod;
return;
}
int mid = (l + r) / 2;
build(x * 2, l, mid);
build(x * 2 + 1, mid + 1, r);
sum[x] = (sum[x * 2] + sum[x * 2 + 1]) % mod;
}
void pushdown(int x, int llen, int rlen)
{
tag[x * 2].k = (tag[x * 2].k * tag[x].k) % mod;
tag[x * 2 + 1].k = (tag[x * 2 + 1].k * tag[x].k) % mod;
tag[x * 2].b = (tag[x * 2].b * tag[x].k + tag[x].b) % mod;
tag[x * 2 + 1].b = (tag[x * 2 + 1].b * tag[x].k + tag[x].b) % mod;
sum[x * 2] = (sum[x * 2] * tag[x].k + tag[x].b * llen) % mod;
sum[x * 2 + 1] = (sum[x * 2 + 1] * tag[x].k + tag[x].b * rlen) % mod;
tag[x].k = 1;
tag[x].b = 0;
}
void multiply(int x, int l, int r, int L, int R, ll k)
{
if (l <= L && R <= r)
{
tag[x].b = (tag[x].b * k) % mod;
tag[x].k = (tag[x].k * k) % mod;
sum[x] = (sum[x] * k) % mod;
return;
}
int mid = (L + R) / 2;
if (tag[x].k > 0 || tag[x].b > 0)
pushdown(x, mid - L + 1, R - mid);
if (l <= mid)
multiply(x * 2, l, r, L, mid, k);
if (r > mid)
multiply(x * 2 + 1, l, r, mid + 1, R, k);
sum[x] = (sum[x * 2] + sum[x * 2 + 1]) % mod;
}
void add(int x, int l, int r, int L, int R, ll k)
{
if (l <= L && R <= r)
{
tag[x].b = (tag[x].b + k) % mod;
sum[x] = (sum[x] + k * (R - L + 1)) % mod;
return;
}
int mid = (L + R) / 2;
if (tag[x].k > 0 || tag[x].b > 0)
pushdown(x, mid - L + 1, R - mid);
if (l <= mid)
add(x * 2, l, r, L, mid, k);
if (r > mid)
add(x * 2 + 1, l, r, mid + 1, R, k);
sum[x] = (sum[x * 2] + sum[x * 2 + 1]) % mod;
}
ll print(int x, int l, int r, int L, int R)
{
if (l <= L && R <= r)
return sum[x] % mod;
int mid = (L + R) / 2;
ll res = 0ll;
if (tag[x].b > 0 || tag[x].k > 0)
pushdown(x, mid - L + 1, R - mid);
if (l <= mid)
res = (res + print(x * 2, l, r, L, mid)) % mod;
if (mid < r)
res = (res + print(x * 2 + 1, l, r, mid + 1, R)) % mod;
return res % mod;
}
int main()
{
scanf("%d%d%lld", &n, &m, &mod);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, 1, n);
for (int i = 1; i <= m; i++)
{
scanf("%d", &c);
if (c == 1)
{
scanf("%d%d%lld", &xx, &yy, &kk);
multiply(1, xx, yy, 1, n, kk);
}
if (c == 2)
{
scanf("%d%d%lld", &xx, &yy, &kk);
add(1, xx, yy, 1, n, kk);
}
if (c == 3)
{
scanf("%d%d", &xx, &yy);
printf("%lld\n", print(1, xx, yy, 1, n) % mod);
}
}
return 0;
}