#include <bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
const int maxn = 114514;
struct tree
{
int l, r;
ll sum, add, mul;
#define sum(x) t[x].sum
#define add(x) t[x].add
#define mul(x) t[x].mul
#define l(x) t[x].l
#define r(x) t[x].r
#define ls(x) x << 1
#define rs(x) x << 1 | 1
} t[maxn << 2];
ll mod, n, m, nums[maxn];
void build(int p, int l, int r)
{
l(p) = l, r(p) = r;
mul(p) = 1;
if (l == r)
{
sum(p) = nums[l] % mod;
return ;
}
int mid = (l + r) >> 1;
build(ls(p), l, mid);
build(rs(p), mid + 1, r);
sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
}
void mark(int p)
{
sum(ls(p)) = (ll)(sum(ls(p)) * mul(p) +
(add(p) * (r(ls(p)) - l(ls(p)) + 1)) % mod) % mod;
sum(rs(p)) = (ll)(sum(rs(p)) * mul(p) +
(add(p) * (r(rs(p)) - l(rs(p)) + 1)) % mod) % mod;
mul(ls(p)) = (ll)(mul(ls(p)) * mul(p)) % mod;
mul(rs(p)) = (ll)(mul(rs(p)) * mul(p)) % mod;
add(ls(p)) = (ll)(add(ls(p)) * mul(p) + add(p)) % mod;
add(rs(p)) = (ll)(add(rs(p)) * mul(p) + add(p)) % mod;
add(p) = 0, mul(p) = 1;
return ;
}
void pls(int p, int l, int r, ll k)
{
if (l(p) >= l && r(p) <= r)
{
add(p) = (add(p) + k) % mod;
sum(p) = (sum(p) + k * (r(p) - l(p) + 1)) % mod;
return ;
}
mark(p);
int mid = (l(p) + r(p)) >> 1;
sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
if (l <= mid) pls(ls(p), l, r, k);
if (r > mid) pls(rs(p), l, r, k);
sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
}
void mu(int p, int l, int r, ll k)
{
if (l(p) >= l && r(p) <= r)
{
mul(p) = (mul(p) * k) % mod;
add(p) = (add(p) * k) % mod;
sum(p) = (sum(p) * k) % mod;
return ;
}
mark(p);
int mid = (l + r) >> 1;
sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
if (l <= mid) mu(ls(p), l, r, k);
if (r > mid) mu(rs(p), l, r, k);
sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
}
ll ask(int p, int l, int r)
{
if (l(p) >= l && r(p) <= r)
{
return sum(p);
}
mark(p);
int mid = (l + r) >> 1;
ll ans = 0;
if (l <= mid) ans = (ans + ask(ls(p), l, r)) % mod;
if (r > mid) ans += (ans + ask(rs(p), l, r)) % mod;
return ans;
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);
cin >> n >> m >> mod;
for (int i = 1; i <= n; i++)
{
cin >> nums[i];
}
build(1, 1, n);
while (m--)
{
int op, l, r;
cin >> op >> l >> r;
if (op == 1)
{
ll x;
cin >> x;
mu(1, l, r, x);
}
else if (op == 2)
{
ll x;
cin >> x;
pls(1, l, r, x);
}
else
{
cout << ask(1, l, r) << "\n";
}
}
return 0;
}