RT。全开 long long 了
#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
const int inf=2e5;
int mod;
long long n[inf],tree[4*inf],lazy[4*inf],lazy2[4*inf];
inline int lson(int n){return n<<1;}
inline int rson(int n){return (n<<1)|1;}
inline void push_up_sum(int p)
{
tree[p]=tree[lson(p)]+tree[rson(p)];
}
void btree(int a,int l,int r)
{
if(l==r){tree[a]=n[l];return;}
int mid=(l+r)>>1;
btree(lson(a),l,mid);
btree(rson(a),mid+1,r);
push_up_sum(a);
}
inline void f_add(int now,int l,int r,long long p)
{
lazy[now]=(lazy[now]+p)%mod;
tree[now]=(p*(r-l+1)%mod+tree[now])%mod;
}
inline void f_mul(int now,int l,int r,long long p)
{
tree[now]=tree[now]*p%mod;
lazy[now]=lazy[now]*p%mod;
lazy2[now]=lazy2[now]*p%mod;
}
inline void push_down(int now,int l,int r)
{
int mid=(l+r)>>1;
f_mul(lson(now),l,mid,lazy2[now]);
f_mul(rson(now),mid+1,r,lazy2[now]);
f_add(lson(now),l,mid,lazy[now]);
f_add(rson(now),mid+1,r,lazy[now]);
lazy[now]=0,lazy2[now]=1;
}
inline void change_add(int a,int l,int r,int lft,int rgt,long long add)
{
if(lft<=l&&r<=rgt)
{
f_add(a,l,r,add);
return;
}
push_down(a,l,r);
int mid=(l+r)>>1;
if(lft<=mid)change_add(lson(a),l,mid,lft,rgt,add);
if(rgt>mid)change_add(rson(a),mid+1,r,lft,rgt,add);
push_up_sum(a);
}
inline void change_mul(int a,int l,int r,int lft,int rgt,long long mul)
{
if(lft<=l&&r<=rgt)
{
f_mul(a,l,r,mul);
return;
}
push_down(a,l,r);
int mid=(l+r)>>1;
if(lft<=mid)change_mul(lson(a),l,mid,lft,rgt,mul);
if(rgt>mid)change_mul(rson(a),mid+1,r,lft,rgt,mul);
push_up_sum(a);
}
long long ask(int a,int l,int r,int lft,int rgt)
{
if(lft<=l&&r<=rgt)return tree[a];
int mid=(l+r)>>1;
push_down(a,l,r);
long long n=0;
if(lft<=mid)n=ask(lson(a),l,mid,lft,rgt);
if(rgt>mid)n+=ask(rson(a),mid+1,r,lft,rgt);
return n%mod;
}
signed main()
{
int a,b;
cin>>a>>mod;
for(int i=1;i<=4*a;i++)lazy2[i]=1;
for(int i=1;i<=a;i++)
{
scanf("%lld",&n[i]);
}
cin>>b;
btree(1,1,a);
for(int i1=1;i1<=b;i1++)
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
if(t1==1)
{
long long t4;
cin>>t4;
t4%=mod;
change_mul(1,1,a,t2,t3,t4);
}
else if(t1==2)
{
long long t4;
cin>>t4;
t4%=mod;
change_add(1,1,a,t2,t3,t4);
}
else
{
cout<<ask(1,1,a,t2,t3)<<'\n';
}
}
return 0;
}