rt,敲的线段树,这是代码,看不出错哪了,求条
#include<bits/stdc++.h>
#define int __int128
using namespace std;
inline int read(){
char c=getchar();
int ret=0,f=1;
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
ret=(ret<<3)+(ret<<1)+c-'0';
c=getchar();
}return ret*f;
}
inline void write(int x,int op){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10,0);
putchar((char)(x%10+'0'));
if(op){
if(op>0)puts("");
if(op<0)putchar(' ');
if(op==0)puts("114514");
}
}
const int N=4e5+10;
int n,p,k,a[N];
struct node{
int ad,mu=1,t;
}tree[N];
void push_up(int id){
tree[id].t=(tree[id*2].t+tree[id*2+1].t)%p;
}
void push_down(int id,int l,int r){
if(tree[id].ad){
int mid=(l+r)>>1;
tree[id*2].ad=tree[id*2].ad*tree[id].mu%p;
tree[id*2].ad=(tree[id*2].ad+tree[id].ad)%p;
tree[id*2].t=tree[id*2].t*tree[id].mu%p;
tree[id*2].t=(tree[id*2].t+tree[id].ad*(mid-l+1)%p)%p;
tree[id*2].mu=tree[id*2].mu*tree[id].mu%p;
tree[id*2+1].ad=tree[id*2+1].ad*tree[id].mu%p;
tree[id*2+1].ad=(tree[id*2+1].ad+tree[id].ad)%p;
tree[id*2+1].t=tree[id*2+1].t*tree[id].mu%p;
tree[id*2+1].t=(tree[id*2+1].t+tree[id].ad*(r-mid)%p)%p;
tree[id*2+1].mu=tree[id*2+1].mu*tree[id].mu%p;
tree[id].ad=0,tree[id].mu=1;
}
}
void bui(int id,int l,int r){
if(l==r){
tree[id].t=a[l]%p;
return ;
}
int mid=(l+r)>>1;
bui(id*2,l,mid);
bui(id*2+1,mid+1,r);
tree[id].t=(tree[id*2].t+tree[id*2+1].t)%p;
}
void gx(int id,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
tree[id].t=(tree[id].t+v*(r-l+1)%p)%p;
tree[id].ad=(tree[id].ad+v);
return ;
}
push_down(id,l,r);
int mid=(l+r)>>1;
if(x<=mid)gx(id*2,l,mid,x,y,v);
if(y>mid)gx(id*2+1,mid+1,r,x,y,v);
// push_down(id*2,l,r);
// push_down(id*2+1,l,r);
push_up(id);
}
void gxm(int id,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
tree[id].mu=tree[id].mu*v%p;
tree[id].ad=tree[id].ad*v%p;
tree[id].t=tree[id].t*v%p;
return ;
}
push_down(id,l,r);
int mid=(l+r)>>1;
if(x<=mid)gxm(id*2,l,mid,x,y,v);
if(y>mid)gxm(id*2+1,mid+1,r,x,y,v);
// push_down(id*2,l,r);
// push_down(id*2+1,l,r);
push_up(id);
}
int find(int id,int l,int r,int x,int y){
if(x<=l&&y>=r)return tree[id].t;
push_down(id,l,r);
int mid=(l+r)>>1,ret=0;
if(x<=mid)ret=(ret+find(id*2,l,mid,x,y))%p;
if(y>mid)ret=(ret+find(id*2+1,mid+1,r,x,y))%p;
push_up(id);
return ret%p;
}
signed main(){
n=read(),p=read();
for(int i=1;i<=n;i++)a[i]=read();
bui(1,1,n);
k=read();
for(int i=1;i<=k;i++){
int op=read();
if(op==1){
int x=read(),y=read(),k=read();
gxm(1,1,n,x,y,k);
}else if(op==2){
int x=read(),y=read(),k=read();
gx(1,1,n,x,y,k);
}else{
int x=read(),y=read();
write(find(1,1,n,x,y)%p,1);
}
}
return 0;
}