WA on #9
能取模的地方应该都取了。。。
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#define int __int128_t
#define inlind inline void
#define inlinl inline bool
#define inlint inline int
#define inlinc inline char
#define inlins inline string
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,0x80,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
using namespace std;
struct seg{int l,r,sum,lazym,lazyp,mid;}segt[8*120000];
int n,m;
int a[1000300];
int p;
inlind bt(int id,int l,int r){
int mid=(l+r)/2;
if(l==r) {segt[id]={l,r,a[l]%p,1,0,mid};return ;}
bt(id*2,l,mid);
bt(id*2+1,mid+1,r);
segt[id]={l,r,segt[id*2].sum+segt[id*2+1].sum,1,0,mid};
}
inlind upd(int id){
segt[id].sum*=segt[id].lazym%p;
segt[id].sum%=p;
segt[id].sum+=segt[id].lazyp*(segt[id].r-segt[id].l+1)%p;
segt[id].sum%=p;
if(segt[id].l!=segt[id].r){
segt[id*2].lazyp*=segt[id].lazym;
segt[id*2].lazym*=segt[id].lazym;
segt[id*2+1].lazyp*=segt[id].lazym;
segt[id*2+1].lazym*=segt[id].lazym;
segt[id*2].lazyp%=p;
segt[id*2].lazym%=p;
segt[id*2+1].lazyp%=p;
segt[id*2+1].lazym%=p;
segt[id*2].lazyp+=segt[id].lazyp;
segt[id*2+1].lazyp+=segt[id].lazyp;
segt[id*2].lazyp%=p;
segt[id*2+1].lazyp%=p;
}
segt[id].lazym=1;
segt[id].lazyp=0;
}
inlint getsum(int id,int l,int r){
if(segt[id].lazym!=1||segt[id].lazyp!=0)
upd(id);
if(segt[id].l==l&&r==segt[id].r){return segt[id].sum%p;}
int mid=segt[id].mid;
if(l>=mid+1)return getsum(id*2+1,l,r)%p;
else if(r<=mid) return getsum(id*2,l,r)%p;
else return (getsum(id*2,l,mid)+getsum(id*2+1,mid+1,r))%p;
}
inlind reb(int id,int l,int r,int x,int t){
if(segt[id].l==l&&r==segt[id].r){
if(t==1){
segt[id].lazym*=x;
segt[id].lazyp*=x;
segt[id].lazyp%=p;
segt[id].lazym%=p;
}
else {
segt[id].lazyp+=x;
segt[id].lazyp%=p;
}
return ;
}
else{
if(t==1)
segt[id].sum=(segt[id].sum+(x-1)*getsum(id,l,r)%p)%p;
else{upd(id);
segt[id].sum=(segt[id].sum+x*(r-l+1)%p)%p;
}
}
int mid=segt[id].mid;
if(l>=mid+1)reb(id*2+1,l,r,x,t);
else if(r<=mid)reb(id*2,l,r,x,t);
else {reb(id*2,l,mid,x,t);reb(id*2+1,mid+1,r,x,t);}
}
inlint re()
{
int s = 0;
char ch = getchar();
while(!isdigit(ch))
ch = getchar();
while(isdigit(ch)) {
s = s * 10 + ch - '0';
ch = getchar();
}
return s;
}
inlind wr(int x){
if(x>9) wr(x/10);
putchar('0'+x%10);
}
signed main(){
n=re();
p=re();
for(int i=1;i<=n;i++)a[i]=re();
bt(1,1,n);
m=re();
for(int i=1;i<=m;i++){
int op;
op=re();
if(op<=2){
int l,r,x;
l=re();
r=re();
x=re();
reb(1,l,r,x%p,op);
}
else {
int l,r;
l=re();
r=re();
wr(getsum(1,l,r)%p);
putchar('\n');
}
}
return 0;
}