#include <bits/stdc++.h>
#define ll long long
#define AC 0
using namespace std;
const ll MAXN = 1e5 + 5;
ll n, p;
ll arr[MAXN];
ll tree[MAXN * 4], add[MAXN * 4], mul[MAXN * 4];
void update(ll root)
{
tree[root] = tree[root << 1] + tree[root << 1 | 1];
}
void build(ll l, ll r, ll root)
{
add[root] = 0;
mul[root] = 1;
if (l == r)
{
tree[root] = arr[l] % p;
return ;
}
ll mid = l + ((r - l) >> 1);
build(l, mid, root << 1);
build(mid + 1, r, root << 1 | 1);
update(root);
}
void pushdown(ll l, ll r, ll root)
{
ll mid = (l + r) >> 1;
if (mul[root] != 1 || add[root] != 0)
{
tree[root<<1] = (tree[root<<1] * mul[root] + add[root] * (mid - l + 1)) % p;
mul[root<<1] = (mul[root<<1] * mul[root]) % p;
add[root<<1] = (add[root<<1] * mul[root] + add[root]) % p;
tree[root<<1|1] = (tree[root<<1|1] * mul[root] + add[root] * (r - mid)) % p;
mul[root<<1|1] = (mul[root<<1|1] * mul[root]) % p;
add[root<<1|1] = (add[root<<1|1] * mul[root] + add[root]) % p;
mul[root] = 1;
add[root] = 0;
}
}
void modify_mul(ll x, ll y, ll val, ll l, ll r, ll root)
{
if (x <= l && r <= y)
{
tree[root] = (tree[root] * val) % p;
mul[root] = (mul[root] * val) % p;
add[root] = (add[root] * val) % p;
return;
}
pushdown(l, r, root);
ll mid = (l + r) >> 1;
if (x <= mid)
{
modify_mul(x, y, val, l, mid, root << 1);
}
if (y > mid)
{
modify_mul(x, y, val, mid + 1, r, root << 1 | 1);
}
update(root);
}
void modify_add(ll x, ll y, ll val, ll l, ll r, ll root)
{
if (x <= l && r <= y)
{
tree[root] = (tree[root] + val * (r - l + 1)) % p;
add[root] = (add[root] + val) % p;
return;
}
pushdown(l, r, root);
ll mid = (l + r) >> 1;
if (x <= mid)
{
modify_add(x, y, val, l, mid, root << 1);
}
if (y > mid)
{
modify_add(x, y, val, mid + 1, r, root << 1 | 1);
}
update(root);
}
ll query(ll x, ll y, ll l, ll r, ll root)
{
if (x <= l && r <= y)
{
return tree[root];
}
ll mid = l + ((r - l) >> 1);
pushdown(l, r, root);
ll sum = 0;
if (x <= mid)
{
sum += query(x, y, l, mid, root << 1);
}
if (y > mid)
{
sum += query(x, y, mid + 1, r, root << 1 | 1);
}
return sum % p;
}
int main()
{
cin >> n >> p;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
build(1, n, 1);
ll m;
cin >> m;
while (m--)
{
ll op, t, g, c;
cin >> op;
if (op == 3)
{
cin >> t >> g;
cout << query(t, g, 1, n, 1) % p << endl;
}
else
{
cin >> t >> g >> c;
if (op == 1)
{
modify_mul(t, g, c % p, 1, n, 1);
}
else
{
modify_add(t, g, c % p, 1, n, 1);
}
}
}
return AC;
}
码风良好