我是不会说这个题很坑的。。
改了一晚上。。。// by SiriusRen#include#define N 150000#define LSON l,mid,lson#define RSON mid+1,r,rson#define LL long longusing namespace std;LL n,m,mod,xx,yy,zz,jy;LL mul[N*4],add[N*4],sum[N*4];int get(){ int x=0;char p=getchar(); while(p<'0'||p>'9')p=getchar(); while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar(); return x;}void build(int l,int r,int pos){ mul[pos]=1; if(l==r){sum[pos]=get();return;} int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1; build(LSON);build(RSON); sum[pos]=(sum[lson]+sum[rson])%mod;}void push_down(int pos,int lson,int rson,int num){ mul[lson]=(mul[pos]*mul[lson])%mod; mul[rson]=(mul[pos]*mul[rson])%mod; add[lson]=(add[lson]*mul[pos]+add[pos])%mod; add[rson]=(add[rson]*mul[pos]+add[pos])%mod; sum[lson]=(sum[lson]*mul[pos]+add[pos]*(num-(num>>1)))%mod; sum[rson]=(sum[rson]*mul[pos]+add[pos]*(num>>1))%mod; mul[pos]=1;add[pos]=0;}void update(int l,int r,int pos){ if(l>=xx&&r<=yy){ if(jy==1){ mul[pos]=(mul[pos]*zz)%mod; add[pos]=(add[pos]*zz)%mod; sum[pos]=(sum[pos]*zz)%mod; } else{ add[pos]=(add[pos]+zz)%mod; sum[pos]=(sum[pos]+(r-l+1)*zz)%mod; } return; } int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1; if(mul[pos]!=1||add[pos]) push_down(pos,lson,rson,r-l+1); if(mid>=xx)update(LSON); if(mid =xx&&r<=yy){ return sum[pos]; } if(mul[pos]!=1||add[pos]) push_down(pos,lson,rson,r-l+1); if(mid>=yy)return query(LSON); else if(mid