uoj46玄学
复杂度辣鸡没人权
疯狂爆oj
感觉要被众多uoj用户骂了
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define LS ls[now]?ls[now]:(tr[++NODE]=stru(),ls[now]=NODE) 4 #define RS rs[now]?rs[now]:(tr[++NODE]=stru(),rs[now]=NODE) 5 #define mid (l+r>>1) 6 using namespace std; 7 int MOD,NODE,KEY,n,m,opt,l,r,x,y; 8 int root[800001]; 9 int ls[20000001],rs[20000001],st[800001],L[800001],R[800001],X[800001],Y[800001]; 10 struct stru 11 { 12 long long k,b; 13 stru() 14 { 15 k=1;b=0; 16 } 17 stru(int K,int B) 18 { 19 k=K;b=B; 20 } 21 } tr[20000001],alb[800001]; 22 stru merge(stru x,stru y) 23 { 24 return stru(x.k*y.k%MOD,(x.b*y.k+y.b)%MOD); 25 } 26 bool is(stru p) 27 { 28 return(p.k!=1 || p.b!=0); 29 } 30 void add(int now,int l,int r,int x,int y,int p,int q) 31 { 32 if(l==x && r==y) 33 { 34 tr[now]=merge(tr[now],stru(p,q)); 35 return; 36 } 37 if(is(tr[now])) 38 { 39 tr[LS]=merge(tr[LS],tr[now]); 40 tr[RS]=merge(tr[RS],tr[now]); 41 tr[now]=stru(); 42 } 43 if(x<=mid) add(LS,l,mid,x,min(mid,y),p,q); 44 if(y>mid) add(RS,mid+1,r,max(mid+1,x),y,p,q); 45 } 46 int read() 47 { 48 int x=0;char c=getchar(); 49 while (c<'0'||c>'9')c=getchar(); 50 while (c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 51 return x; 52 } 53 int main() 54 { 55 KEY=read(); 56 n=read();MOD=read(); 57 for(int i=1;i<=n;i++) 58 st[i]=read(); 59 m=read(); 60 int N=5000; 61 int lastans=0; 62 for(int i=1,j=0,J=0;i<=m;i++) 63 { 64 opt=read();l=read();r=read();x=read(); 65 if(KEY&1) 66 l^=lastans,r^=lastans; 67 if(opt==1) 68 { 69 y=read(); 70 L[++j]=l;R[j]=r;X[j]=x;Y[j]=y; 71 if(j%N==1) 72 root[++J]=++NODE; 73 add(root[J],1,n,l,r,x,y); 74 } 75 if(opt==2) 76 { 77 if(KEY&1) 78 x^=lastans; 79 int k,K;ll ret=st[x]; 80 for(k=l;k%N!=1 && k<=r;k++) 81 if(L[k]<=x && x<=R[k]) 82 ret=(ret*X[k]+Y[k])%MOD; 83 if(k<=r) 84 { 85 for(K=k/N+1;K*N<=r;K++) 86 { 87 int now=root[K],l=1,r=n,top=0; 88 while(l<r) 89 { 90 if(is(tr[now])) 91 alb[++top]=tr[now]; 92 if(x<=mid) 93 now=LS,r=mid; 94 else 95 now=RS,l=mid+1; 96 } 97 stru tem=tr[now]; 98 for(int i=top;i;i--) 99 tem=merge(tem,alb[i]); 100 // tem=que(root[]) 101 ret=(tem.k*ret+tem.b)%MOD; 102 } 103 for(k=(K-1)*N+1;k<=r;k++) 104 if(L[k]<=x && x<=R[k]) 105 ret=(ret*X[k]+Y[k])%MOD; 106 } 107 printf("%d\n",ret); 108 // puts("OK"); 109 lastans=ret; 110 } 111 } 112 return 0; 113 }