fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5.  
  6. const int N = 1e5+5;
  7. const int K = 30;
  8.  
  9. int n, q, a[N];
  10.  
  11. int st[4*N][K], lz[4*N];
  12.  
  13. void pull(int id) {
  14. for (int k = 0; k < K; k++) st[id][k] = st[id << 1][k] + st[id << 1 | 1][k];
  15. }
  16.  
  17. void apply(int id, int l, int r, int x) {
  18. int len = r - l + 1;
  19. for (int k = 0; k < K; k++)
  20. if ((x >> k) & 1) st[id][k] = len - st[id][k];
  21. lz[id] ^= x;
  22. }
  23.  
  24. void push(int id, int l, int r) {
  25. if (!lz[id]) return;
  26. int mid = (l + r) >> 1;
  27. apply(id << 1, l, mid, lz[id]);
  28. apply(id << 1 | 1, mid + 1, r, lz[id]);
  29. lz[id] = 0;
  30. }
  31.  
  32. void build(int id, int l, int r) {
  33. if (l == r) {
  34. apply(id, l, l, a[l]);
  35. return;
  36. }
  37. int mid = (l + r) >> 1;
  38. build(id << 1, l, mid);
  39. build(id << 1 | 1, mid + 1, r);
  40. pull(id);
  41. }
  42.  
  43. void update(int id, int l, int r, int u, int v, int x) {
  44. if (v < l || r < u) return;
  45. if (u <= l && r <= v) {
  46. apply(id, l, r, x);
  47. return;
  48. }
  49. push(id, l, r);
  50. int mid = (l + r) >> 1;
  51. update(id << 1, l, mid, u, v, x);
  52. update(id << 1 | 1, mid + 1, r, u, v, x);
  53. pull(id);
  54. }
  55.  
  56. void query(int id, int l, int r, int u, int v, int* res) {
  57. if (v < l || r < u) return;
  58. if (u <= l && r <= v) {
  59. for (int k = 0; k < K; k++) res[k] += st[id][k];
  60. return;
  61. }
  62. push(id, l, r);
  63. int mid = (l + r) >> 1;
  64. query(id << 1, l, mid, u, v, res);
  65. query(id << 1 | 1, mid + 1, r, u, v, res);
  66. }
  67.  
  68. void solve() {
  69. cin >> n >> q;
  70. for (int i = 1; i <= n; i++) cin >> a[i];
  71. build(1, 1, n);
  72. while (q--) {
  73. int op, l, r, x; cin >> op >> l >> r >> x;
  74. if (op == 1) {
  75. update(1, 1, n, l, r, x);
  76. } else {
  77. int cnt[K] = {0};
  78. query(1, 1, n, l, r, cnt);
  79. int ans = 0;
  80. for (int k = 0; k < K; k++) {
  81. int bit = (x >> k) & 1, res = 0;
  82. if (op == 2) res = bit ^ (cnt[k] & 1);
  83. else if (op == 3) res = bit && (cnt[k] == r - l + 1);
  84. else if (op == 4) res = bit || (cnt[k] > 0);
  85. if (res) ans |= (1 << k);
  86. }
  87. cout << ans << '\n';
  88. }
  89. }
  90. }
  91.  
  92. int main() {
  93. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  94.  
  95. int tests = 1; // cin >> tests;
  96. while (tests--) solve();
  97.  
  98. #ifdef LOCAL
  99. cerr << "\nTime elapsed: " << clock() << " ms.\n";
  100. #endif
  101.  
  102. return 0;
  103. }
  104.  
Success #stdin #stdout 0.01s 5284KB
stdin
3 7
1 2 3
2 2 3 69
3 2 3 69
4 2 3 69
1 1 2 1
2 2 3 69
3 2 3 69
4 2 3 69
stdout
68
0
71
69
1
71