Advertisement
Guest User

Untitled

a guest
Jun 27th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<ll,ll> ii;
  6.  
  7. const int kn = 5e4 + 5, sqr = 223;
  8.  
  9. #define ff(i,n) for(int i = 1; i<=n;i++)
  10. #define _ff(i,n) for(int i = n; i>=1; i--)
  11.  
  12. struct Query
  13. {
  14. int l, r, id;
  15. }qr[5001];
  16.  
  17. bool optionqr(Query a, Query b)
  18. {
  19. if(int(a.r/sqr) != int(b.r/sqr)) return int(a.r/sqr) < int(b.r/sqr);
  20. return a.l < b.l;
  21. }
  22.  
  23. struct Trie
  24. {
  25. multiset<int> val;
  26. int c[2];
  27. Trie()
  28. {
  29. c[0] = c[1] = -1;
  30. }
  31. }trie[2][kn];
  32.  
  33. int n, q;
  34. int a[kn], top = 0;
  35.  
  36. int F(int i)
  37. {
  38. int tmp = i%4;
  39. if(tmp == 0) return i;
  40. if(tmp == 1) return 1;
  41. if(tmp == 2) return i+1;
  42. return 0;
  43. }
  44.  
  45. void add(int num, int k)
  46. {
  47. int p = 0;
  48. int X = (num == 1) ? F(k) : F(k-1);
  49. for(int i = 19; i>=0; i--)
  50. {
  51. trie[num][p].val.insert(k);
  52. int tmp = (X>>i)&1;
  53. if(trie[num][p].c[tmp] == -1) trie[num][p].c[tmp] = ++top;
  54. p = trie[num][p].c[tmp];
  55. if(i==0) trie[num][p].val.insert(k);
  56. }
  57. }
  58.  
  59. void dele(int num, int k)
  60. {
  61. int p = 0;
  62. int X = (num == 1) ? F(k) : F(k-1);
  63. for(int i = 19; i>=0; i--)
  64. {
  65. auto it = trie[num][p].val.find(k);
  66. trie[num][p].val.erase(k);
  67. int tmp = (X>>i)&1;
  68. p = trie[num][p].c[tmp];
  69. if(i==0)
  70. {
  71. it = trie[num][p].val.find(k);
  72. trie[num][p].val.erase(it);
  73. }
  74. }
  75. }
  76.  
  77. int findtrie0(int k)
  78. {
  79. int p = 0, X = F(k);
  80. //cout << X << endl;
  81. bool larger = false;
  82. for(int i = 19; i>=0; i--)
  83. {
  84. int tmp = (X>>i)&1;
  85. int cur = -1;
  86. if(not (trie[0][p].c[1-tmp] == -1 || not (trie[0][trie[0][p].c[1-tmp]].val).size() || *(trie[0][trie[0][p].c[1-tmp]].val).begin() > k) )
  87. {
  88. cur = 1-tmp;
  89. if(not larger) larger = true;
  90. //cout <<"ok "<<i << endl;
  91. }
  92. else
  93. {
  94. if(not larger && tmp == 1) return X;
  95. cur = tmp;
  96. }
  97. if(cur == -1) return 696969669;
  98. p = trie[0][p].c[cur];
  99. if(i==0) return (F(*trie[0][p].val.begin() -1)^X);
  100. }
  101.  
  102. }
  103.  
  104. int findtrie1(int X)
  105. {
  106.  
  107. }
  108.  
  109. int main()
  110. {
  111. add(0,21); add(0,5); dele(0,21);
  112. cout << findtrie0(104);
  113. scanf("%d %d", &n, &q);
  114. ff(i,n)
  115. {
  116. scanf("%d", &a[i]);
  117. }
  118. ff(i,q)
  119. {
  120. scanf("%d %d %d", &qr[i].l, &qr[i].r);
  121. qr[i].id = i;
  122. }
  123. sort(qr+1, qr+q+1, optionqr);
  124.  
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement