#include <bits/stdc++.h>
using namespace std;
struct node
{
int l;
int r;
long long sum;
int time;
long long plus;
};
node t[400005];
long long n, m, mod, a[400005];
void build(long long p, long long l, long long r)
{
t[p].l= l, t[p].r = r, t[p].time = 1, t[p].plus = 0;
if (l == r)
{
t[p].sum = a[l] % mod; return;
}
long long mid = (l + r) >> 1;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
t[p].sum = (t[p * 2].sum + t[p * 2 + 1].sum) % mod;
}
void push_down(long long p)
{
if (t[p].time != 1 || t[p].plus != 0)
{
t[p * 2].time *= t[p].time;
t[p * 2].time %= mod;
t[p * 2].plus *= t[p].time;
t[p * 2].plus += t[p].plus;
t[p * 2].plus %= mod;
t[p * 2].sum = t[p * 2].sum * t[p].time + (t[p * 2].r - t[p * 2].l + 1) * t[p].plus;
t[p * 2].sum %= mod;
t[p * 2 + 1].time *= t[p].time;
t[p * 2 + 1].time %= mod;
t[p * 2 + 1].plus *= t[p].time;
t[p * 2 + 1].plus += t[p].plus;
t[p * 2 + 1].plus %= mod;
t[p * 2 + 1].sum = t[p * 2 + 1].sum * t[p].time + (t[p * 2 + 1].r - t[p * 2 + 1].l + 1) * t[p].plus;
t[p * 2 + 1].sum %= mod;
t[p].time = 1;
t[p].plus = 0;
}
}
void ctime(long long p, long long l, long long r, long long d)
{
if (l <= t[p].l && r >= t[p].r)
{
t[p].sum = t[p].sum * d % mod;
t[p].time *= d;
t[p].time %= mod;
t[p].plus *= d;
t[p].plus %= mod;
return;
}
push_down(p);
long long mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) ctime(p * 2, l, r, d);
if (r > mid) ctime(p * 2 + 1, l, r, d);
t[p].sum = (t[p * 2].sum + t[p * 2 + 1].sum) % mod;
}
void add(long long p, long long l, long long r, long long d)
{
if (l <= t[p].l && r >= t[p].r)
{
t[p].sum += (t[p].r - t[p].l + 1) * d % mod;
t[p].plus += d % mod;
return;
}
push_down(p);
long long mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) add(p * 2, l, r, d);
if (r > mid) add(p * 2 + 1, l, r, d);
t[p].sum = (t[p * 2].sum + t[p * 2 + 1].sum) % mod;
}
long long ask(long long p, long long l, long long r)
{
if (l <= t[p].l && r >= t[p].r) return t[p].sum;
push_down(p);
long long mid = (t[p].l + t[p]. r) >> 1, val = 0;
if (l <= mid) val += ask(p * 2, l , r) % mod;
if (r > mid) val += ask(p * 2 + 1, l , r) % mod;
return val % mod;
}
int main()
{
scanf("%d%d%d", &n, &m, &mod);
for (long long i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
for (long long i = 1; i <= m; i++)
{
long long c, x, y, k;
scanf("%d%d%d", &c, &x, &y);
if (c == 1)
{
scanf("%d", &k);
ctime(1, x, y, k);
}
else if (c == 2)
{
scanf("%d", &k);
add(1, x, y, k);
}
else
{
printf("%d\n", ask(1, x, y) % mod);
}
}
return 0;
}