rt,实际上是1WA+9RE
源码(自己搞了个n=100000的样例,也扩大过数组,没试出问题):
#include<bits/stdc++.h>//前奏过长
using namespace std;
#define in_bufsize (1<<1)
#define out_bufsize (1<<1)
#define flush() (out->sputn(Obuf, optr - Obuf),optr = Obuf)
#define getc() getchar() //ist==ied?ied=Ibuf+in->sgetn(ist = Ibuf, in_bufsize),(ist==ied?EOF:*ist++):*ist++
#define putc(c) putchar(c) //optr==Obuf+out_bufsize?(out->sputn(Obuf, out_bufsize),optr = Obuf),*optr++ = c:*optr++=c
#define rull reg unsigned long long
#define ull unsigned long long
#define lli long long
#define reg register
#define pow2(x) (1<<(x))
#define lb(x) (x&-x)
#define clamp(v,max,min) ((v)>(max)?(max):(v)<(min)?(min):(v))
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<0?(-(x)):(x))
#define FileRW freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
static char Obuf[out_bufsize], Ibuf[in_bufsize],*optr = Obuf, *ist = 0, *ied = 0;
static streambuf *out=cout.rdbuf(), *in=cin.rdbuf();
inline int read(){
reg int a=0;
reg bool isF=0;
reg char c=getc();
while(c<'0'||c>'9'){
isF=(c=='-');
c=getc();
}
while(c>='0'&&c<='9'){
a=(a<<3)+(a<<1)+(c^48);
c=getc();
}
return isF?-a:a;
}
inline void swrite(string s){
for(reg unsigned int i=0;s[i]!='\0';++i){
putc(s[i]);
}
}
inline void write(reg int a){
if(a==INT_MIN){
swrite("-2147483648");
return;
}
if(a<0){
a=-a;
putc('-');
}
reg short top=0;
static char sc[15];
do{
sc[top++]=a%10+48;
a/=10;
}while(a);
while(top){
putc(sc[--top]);
}
}
int n,p,m;
lli a[100005],tr[100005<<2],la[100005<<2],la_mul[100005<<2];//la_mul是维护乘积的懒惰标记,tr是区间和,la是维护和的懒惰标记
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define push_up(x) tr[x]=(tr[ls(x)]+tr[rs(x)])%p
inline void push_down(reg int l,reg int r,reg int dian){
if(la[dian]||la_mul[dian]!=1){
reg int mid=(l+r)>>1,lc=ls(dian),rc=rs(dian);
la_mul[lc]=(la_mul[lc]*la_mul[dian])%p;
la_mul[rc]=(la_mul[rc]*la_mul[dian])%p;
la[lc]=(la[lc]*la_mul[dian])%p;
la[rc]=(la[rc]*la_mul[dian])%p;
tr[lc]=(tr[lc]*la_mul[dian])%p;
tr[rc]=(tr[rc]*la_mul[dian])%p;
la[lc]=(la[lc]+la[dian])%p;
tr[lc]=(tr[lc]+la[dian]*(mid-l+1)%p)%p;
la[rc]=(la[rc]+la[dian])%p;
tr[rc]=(tr[rc]+(la[dian]*(r-mid)%p))%p;
la[dian]=0;
la_mul[dian]=1;
}
}
void build(reg int l,reg int r,reg int dian){
la_mul[dian]=1;
if(l==r){
tr[dian]=a[l];
return;
}
reg int mid=(l+r)>>1;
build(l,mid,ls(dian));
build(mid+1,r,rs(dian));
push_up(dian);
}
void update_add(reg int L,reg int R,reg int k,reg int l,reg int r,reg int dian){
if(L<=l&&r<=R){
tr[dian]=(tr[dian]+k*(r-l+1))%p;
la[dian]=(la[dian]+k)%p;
return;
}
push_down(l,r,dian);
reg int mid=(l+r)>>1;
if(L<=mid){
update_add(L,R,k,l,mid,ls(dian));
}
if(R>mid){
update_add(L,R,k,mid+1,r,rs(dian));
}
push_up(dian);
}
void update_mul(reg int L,reg int R,reg int k,reg int l,reg int r,reg int dian){
if(L<=l&&r<=R){
tr[dian]=(tr[dian]*k)%p;
la_mul[dian]=(la_mul[dian]*k)%p;
la[dian]=(la[dian*k])%p;
return;
}
push_down(l,r,dian);
reg int mid=(l+r)>>1;
if(L<=mid){
update_mul(L,R,k,l,mid,ls(dian));
}
if(R>mid){
update_mul(L,R,k,mid+1,r,rs(dian));
}
push_up(dian);
}
lli ask(reg int L,reg int R,reg int l,reg int r,reg int dian){
if(L<=l&&r<=R){
return tr[dian];
}
push_down(l,r,dian);
reg int mid=(l+r)>>1;
return ((L<=mid?ask(L,R,l,mid,ls(dian)):0)+(R>mid?ask(L,R,mid+1,r,rs(dian)):0))%p;
}
int main(){
n=read();
p=read();
for(reg int i=1;i<=n;i++){
a[i]=read();
}
build(1,n,1);
m=read();
for(reg int i=0,mode,t,g,c;i<m;i++){
mode=read();
t=read();
g=read();
if(mode!=3){
c=read();
if(mode==2){
update_add(t,g,c,1,n,1);
}else{
update_mul(t,g,c,1,n,1);
}
}else{
write(ask(t,g,1,n,1)%p);
putc('\n');
}
}
flush();
return 0;
}