fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define ii pair<int,int>
  5. #define iii pair<int,ii>
  6. #define fi first
  7. #define se second
  8. #define inf 10000000000000000
  9. const int N = 1e5 + 5;
  10. int q, node = 1, nxt[20*N][2], f[20*N], xorall;
  11. int bit1[20*N][20], bit0[20*N][20];
  12. void add(int num) {
  13. int u = 1;
  14. for(int i = 19; i >= 0; i--) {
  15. int c = 0;
  16. if(num&(1<<i)) c = 1;
  17. if(!nxt[u][c]) nxt[u][c] = ++node;
  18. u = nxt[u][c];
  19. for(int j = i; j >= 0; j--) {
  20. if(num&(1<<j)) bit1[u][j]++;
  21. else bit0[u][j]++;
  22. }
  23. f[u]++;
  24. }
  25. }
  26. int check(int num) {
  27. int u = 1;
  28. for(int i = 19; i >= 0; i--) {
  29. int c = 0;
  30. if(num&(1<<i)) c = 1;
  31. if(!nxt[u][c]) return 0;
  32. u = nxt[u][c];
  33. if(f[u] == 0) return 0;
  34. }
  35. return 1;
  36. }
  37. void remov(int num) {
  38. int u = 1;
  39. for(int i = 19; i >= 0; i--) {
  40. int c = 0;
  41. if(num&(1<<i)) c = 1;
  42. u = nxt[u][c];
  43. f[u]--;
  44. for(int j = i; j >= 0; j--) {
  45. if(num&(1<<j)) bit1[u][j]--;
  46. else bit0[u][j]--;
  47. }
  48. }
  49. }
  50. int get(int k, int num) {
  51. int u = 1;
  52. int res = 0;
  53. for(int i = 19; i >= 0; i--) {
  54. int c = 0;
  55. if(num&(1<<i)) c = 1;
  56. int pos = nxt[u][c];
  57. //cout <<
  58. if(pos && k <= f[pos]) {
  59. u = pos;
  60. }
  61. else {
  62. k -= f[pos];
  63. for(int j = i; j >= 0; j--) {
  64. if(num&(1<<j)) res = res + bit0[pos][j]*(1<<j);
  65. else res = res + bit1[pos][j]*(1<<j);
  66. }
  67. u = nxt[u][c^1];
  68. res += k*(1<<i);
  69. }
  70. }
  71. return res;
  72. }
  73. signed main() {
  74. ios::sync_with_stdio(0);
  75. cin.tie(0);
  76. cout.tie(0);
  77. if (fopen("main.inp", "r")) {
  78. freopen("main.inp", "r", stdin);
  79. freopen("main.out", "w", stdout);
  80. }
  81. cin >> q;
  82. while(q--) {
  83. int tt, k;
  84. cin >> tt >> k;
  85. if(tt == 0) add(k^xorall);
  86. if(tt == 1) if(check(k^xorall)) remov(k^xorall);
  87. if(tt == 2) xorall ^= k;
  88. if(tt == 3) {
  89. int ans = get(k,xorall);
  90. cout << ans << '\n';
  91. }
  92. }
  93. return 0;
  94. }
Success #stdin #stdout 0s 5328KB
stdin
Standard input is empty
stdout
Standard output is empty