fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. static const int B = 20;
  5.  
  6. struct PB {
  7. int base[B]{};
  8. int pos[B]{};
  9. };
  10.  
  11. static inline void ins(PB &pb, int x, int idx) {
  12. int v = x, p = idx;
  13. for (int b = B - 1; b >= 0; --b) {
  14. if (((v >> b) & 1) == 0)
  15. continue;
  16. if (pb.base[b] == 0) {
  17. pb.base[b] = v;
  18. pb.pos[b] = p;
  19. return;
  20. }
  21. if (pb.pos[b] < p) {
  22. swap(v, pb.base[b]);
  23. swap(p, pb.pos[b]);
  24. }
  25. v ^= pb.base[b];
  26. }
  27. }
  28.  
  29. static inline int rk(const PB &pb, int l) {
  30. int r = 0;
  31. for (int b = 0; b < B; ++b)
  32. if (pb.base[b] && pb.pos[b] >= l)
  33. ++r;
  34. return r;
  35. }
  36.  
  37. struct TB {
  38. int v[B]{};
  39. int piv[B];
  40. int len = 0;
  41.  
  42. void clear() {
  43. memset(v, 0, sizeof(v));
  44. len = 0;
  45. }
  46.  
  47. void ins(int x) {
  48. for (int b = B - 1; b >= 0; --b) {
  49. if (((x >> b) & 1) == 0)
  50. continue;
  51. if (v[b] == 0) {
  52. v[b] = x;
  53. return;
  54. }
  55. x ^= v[b];
  56. }
  57. }
  58.  
  59. void fin() {
  60. len = 0;
  61. for (int b = B - 1; b >= 0; --b)
  62. if (v[b])
  63. piv[len++] = b;
  64. }
  65.  
  66. long long cnt_from(int idx, int offset, int K) const {
  67. if (idx == len)
  68. return (offset <= K) ? 1 : 0;
  69. int b = piv[idx];
  70. int half = 1 << (len - idx - 1);
  71. int kb = (K >> b) & 1;
  72. int ob = (offset >> b) & 1;
  73. if (kb == 0) {
  74. int next = ob ? (offset ^ v[b]) : offset;
  75. return cnt_from(idx + 1, next, K);
  76. } else {
  77. int next = ob ? offset : (offset ^ v[b]);
  78. return (long long)half + cnt_from(idx + 1, next, K);
  79. }
  80. }
  81.  
  82. long long cnt_leq(int K) const {
  83. if (K < 0)
  84. return 0;
  85. return cnt_from(0, 0, K);
  86. }
  87.  
  88. int kth(long long t) const {
  89. int offset = 0;
  90. for (int idx = 0; idx < len; ++idx) {
  91. int b = piv[idx];
  92. int half = 1 << (len - idx - 1);
  93. int ob = (offset >> b) & 1;
  94. if (t <= half) {
  95. if (ob)
  96. offset ^= v[b];
  97. } else {
  98. t -= half;
  99. if (!ob)
  100. offset ^= v[b];
  101. }
  102. }
  103. return offset;
  104. }
  105. };
  106.  
  107. int main() {
  108. ios::sync_with_stdio(false);
  109. cin.tie(nullptr);
  110.  
  111. int t;
  112. cin >> t;
  113. while (t--) {
  114. int n, q;
  115. cin >> n >> q;
  116. vector<int> a(n + 1);
  117. for (int i = 1; i <= n; ++i)
  118. cin >> a[i];
  119.  
  120. vector<PB> pref(n + 1);
  121. for (int i = 1; i <= n; ++i) {
  122. pref[i] = pref[i - 1];
  123. ins(pref[i], a[i], i);
  124. }
  125.  
  126. auto build = [&](int l, int e) {
  127. TB tb;
  128. tb.clear();
  129. const PB &pb = pref[e];
  130. for (int b = B - 1; b >= 0; --b) {
  131. if (pb.base[b] && pb.pos[b] >= l) {
  132. tb.ins(pb.base[b]);
  133. }
  134. }
  135. tb.fin();
  136. return tb;
  137. };
  138.  
  139. auto firstpos = [&](int l, int r, int need_rank) {
  140. int lo = l, hi = r;
  141. while (lo < hi) {
  142. int mid = (lo + hi) >> 1;
  143. if (rk(pref[mid], l) >= need_rank)
  144. hi = mid;
  145. else
  146. lo = mid + 1;
  147. }
  148. return lo;
  149. };
  150.  
  151. while (q--) {
  152. int l, r;
  153. cin >> l >> r;
  154.  
  155. int d = rk(pref[r], l);
  156.  
  157. vector<int> s(d + 1);
  158. int last = l;
  159. for (int k = 1; k <= d; ++k) {
  160. int sk = firstpos(l, r, k);
  161. s[k] = sk;
  162. last = sk;
  163. }
  164.  
  165. bool ok = true;
  166. int prev = -1;
  167. int seg_start = l;
  168.  
  169. for (int k = 0; k <= d; ++k) {
  170. int seg_end = (k < d ? s[k + 1] - 1 : r);
  171. int L = seg_end - seg_start + 1;
  172. if (L <= 0)
  173. continue;
  174.  
  175. TB tb = build(l, seg_end);
  176. int sz = 1 << tb.len;
  177. long long c = tb.cnt_leq(prev);
  178. if (c + L > sz) {
  179. ok = false;
  180. break;
  181. }
  182. int t = (int)(c + L);
  183. prev = tb.kth(t);
  184.  
  185. seg_start = seg_end + 1;
  186. }
  187.  
  188. cout << (ok ? "YES\n" : "NO\n");
  189. }
  190. }
  191. return 0;
  192. }
  193.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty