P2023
我找不出来qwq
#include<bits/stdc++.h>
#define int long long
using namespace std;
int add[400005],sum[400005],a[100005],modi[4000005];
int n,p,m;
void pushdown(int now,int l,int r,int mid)
{
if (add[now]==0&&modi[now]==1) return;
if (modi[now]!=1)
{
modi[now*2]*=modi[now];
modi[now*2+1]*=modi[now];
sum[now*2]=sum[now*2]*modi[now]%p;
sum[now*2+1]=sum[now*2+1]*modi[now]%p;
add[now*2]=add[now*2]*modi[now]%p;
add[now*2+1]=add[now*2+1]*modi[now]%p;
modi[now]=1;
}
if (add[now]!=0)
{
add[now*2]=(add[now*2]+add[now])%p;
add[now*2+1]=(add[now*2+1]+add[now])%p;
sum[now*2]=(sum[now*2]+(mid-l+1)*add[now]%p)%p;
sum[now*2+1]=(sum[now*2+1]+(r-mid)*add[now]%p)%p;
add[now]=0;
}
}
void change_1(int now,int l,int r,int x,int y,int c)
{
if (l>y||r<x) return;
if (l>=x&&r<=y)
{
modi[now]*=c;
modi[now]%=p;
add[now]*=c;
add[now]%=p;
sum[now]=sum[now]*c%p;
return;
}
int mid=l+r>>1;
pushdown(now,l,r,mid);
change_1(now*2,l,mid,x,y,c);
change_1(now*2+1,mid+1,r,x,y,c);
sum[now]=(sum[now*2]+sum[now*2+1])%p;
}
void change_2(int now,int l,int r,int x,int y,int c)
{
if (l>y||r<x) return;
if (l>=x&&r<=y)
{
add[now]+=c;
add[now]%=p;
sum[now]=(sum[now]+(r-l+1)*c)%p;
return;
}
int mid=l+r>>1;
pushdown(now,l,r,mid);
change_2(now*2,l,mid,x,y,c);
change_2(now*2+1,mid+1,r,x,y,c);
sum[now]=(sum[now*2]+sum[now*2+1])%p;
}
void build(int now,int l,int r)
{
modi[now]=1;
if (l==r)
{
sum[now]=a[l]%p;
add[now]=0;
return;
}
int mid=l+r>>1;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
sum[now]=(sum[now*2]+sum[now*2+1])%p;
}
int query(int now,int l,int r,int x,int y)
{
if (l>y||r<x) return 0;
if (l>=x&&r<=y) return sum[now]%p;
int mid=l+r>>1;
pushdown(now,l,r,mid);
int ans=query(now*2,l,mid,x,y)+query(now*2+1,mid+1,r,x,y);
return ans%p;
}
signed main()
{
scanf("%lld%lld",&n,&p);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
scanf("%lld",&m);
for (int i=1;i<=m;i++)
{
int op;
scanf("%lld",&op);
if (op==1)
{
int t,g,c;
scanf("%lld%lld%lld",&t,&g,&c);
change_1(1,1,n,t,g,c);
}
else if (op==2)
{
int t,g,c;
scanf("%lld%lld%lld",&t,&g,&c);
change_2(1,1,n,t,g,c);
}
else
{
int t,g;
scanf("%lld%lld",&t,&g);
if(p==1)puts("0");
else printf("%lld\n",query(1,1,n,t,g)%p);
}
}
return 0;
}