#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
struct stu
{
int left , right;
int lazy , data;
int ans;
}tree[N << 2];
int n , p;
int a[N];
void build(int l , int r , int i)
{
tree[i] = {l , r , 0 , 0 , 1};
if (l == r)
{
tree[i].ans = a[l];
return ;
}
int mid = l + r >> 1;
build(l , mid , i << 1);
build(mid + 1 , r , i << 1 | 1);
tree[i].data = (tree[i << 1].data + tree[i << 1 | 1].data) % p;
}
void pushdown(int i)
{
int mul = tree[i].ans;
int add = tree[i].lazy;
tree[i << 1].data = (tree[i << 1].data * mul + (tree[i << 1].right - tree[i << 1].left + 1) * add) % p;
tree[i << 1 | 1].data = (tree[i << 1 | 1].data * mul + (tree[i << 1 | 1].right - tree[i << 1 | 1].left + 1) * add) % p;
tree[i << 1].ans = (tree[i << 1].ans * mul) % p;
tree[i << 1 | 1].ans = (tree[i << 1 | 1].ans * mul) % p;
tree[i << 1].lazy = (tree[i << 1].lazy * mul + add) % p;
tree[i << 1 | 1].lazy = (tree[i << 1 | 1].lazy * mul + add) % p;
tree[i].ans = 1;
tree[i].lazy = 0;
}
void modify(int l , int r , int k , int op , int i){
if (l <= tree[i].left && tree[i].right <= r)
{
if (op != 0)
{
tree[i].data = (tree[i].data * k) % p;
tree[i].ans = (tree[i].ans * k) % p;
tree[i].lazy = (tree[i].lazy * k) % p;
}
else
{
tree[i].data = (tree[i].data + (tree[i].right - tree[i].left + 1) * k) % p;
tree[i].lazy = (tree[i].lazy + k) % p;
}
return ;
}
pushdown(i);
int mid = tree[i].left + tree[i].right >> 1;
if (l <= mid)
{
modify(l , r , k , op , i << 1);
}
if (mid < r)
{
modify(l , r , k , op , i << 1 | 1);
}
tree[i].data = (tree[i << 1].data + tree[i << 1 | 1].data) % p;
}
int query(int l , int r , int i)
{
if (l <= tree[i].left && tree[i].right <= r)
{
return tree[i].data % p;
}
pushdown(i);
int mid = tree[i].left + tree[i].right >> 1;
int ans = 0;
if (l <= mid)
{
ans = (ans + query(i << 1 , l , r)) % p;
}
if (mid < r)
{
ans = (ans + query(i << 1 | 1 , l , r)) % p;
}
return ans % p;
}
signed main()
{
cin >> n >> p;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
build(1 , n , 1);
int m;
cin >> m;
int op,l,r,k;
while (m--)
{
int op , l , r;
cin >> op >> l >> r;
if (op == 1)
{
int k;
cin >> k;
modify(l , r , k , 1 , 1);
}
else if (op == 2)
{
int k;
cin >> k;
modify(l , r , k , 0 , 1);
}
else
{
cout << (query(l , r , 1)) % p << endl;
}
}
return 0;
}