//读入 unsignedint A, B, C; inlineunsignedintrng61(){ A ^= A << 16; A ^= A >> 5; A ^= A << 1; unsignedint t = A; A = B; B = C; C ^= t ^ A; return C; } intmain(){ scanf("%d%d%u%u%u", &n, &q, &A, &B, &C); for (int i = 1; i <= n; i++) { a[i] = rng61(); } for (int i = 1; i <= q; i++) { unsignedint l = rng61() % n + 1, r = rng61() % n + 1; if (l > r) swap(l, r); } }
constint N = 1010000; int n,q,lg[N]; unsignedint A,B,C,a[N],ans; //unsigned int f[N][22]; unsignedint f[22][N];//尽量让靠里的那一维连续的变,让内存访问更加连续
inlineunsignedintrng61(){ A ^= A << 16; A ^= A >> 5; A ^= A << 1; unsignedint t = A; A = B; B = C; C ^= t ^ A; return C; }
intmain(){ scanf("%d%d%u%u%u", &n, &q, &A, &B, &C); for (int i = 1; i <= n; i++) { a[i] = rng61(); f[0][i] = a[i]; } // for(int j = 1;j<=20;j++) // for(int i = 1;i+(1<<j)-1<=n;i++) // f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]); for(int j = 1;j<=20;j++) for(int i = 1;i+(1<<j)-1<=n;i++) f[j][i] = max(f[j-1][i],f[j-1][i+(1<<(j-1))]);
lg[1] = 0;//2^0 for(int i = 2;i<=n;i++)//手写,对2求lg取下整 lg[i] = lg[i/2]+1;
for (int i = 1; i <= q; i++) { unsignedint l = rng61() % n + 1, r = rng61() % n + 1; if (l > r) swap(l, r); //写法1 //int len = lg[r-l+1]; //写法2 //int len = __lg(r-l+1); //写法3 int len = 31-__builtin_clz(r-l+1);//__builtin_clz数二进制位的前导0 //2^x<=len,2^(x+1)>len ans ^= max(f[len][l],f[len][r-(1<<len)+1]); } cout<<ans<<endl; }