Submission #466161

#TimeUsernameProblemLanguageResultExecution timeMemory
466161MKutayBozkurtXORanges (eJOI19_xoranges)C++14
100 / 100
116 ms3928 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class fenwickTree {
  public:
    vector<int> table;
    int n;
    fenwickTree(int N) {
      n = N + 1;
      table.resize(n);
    }
    int query(int i) {
      int v{};
			i++;
      while (i > 0) {
        v ^= table[i];
        i -= i & (-i);
      }
      return v;
    }
    int range_query(int l, int r) {
      return query(r) ^ query(l - 1);
    }
		void update(int i, int delta) {
			int prev = range_query(i, i);
			i++;
      while (i < n) {
				table[i] ^= prev;
        table[i] ^= delta;
        i += i & (-i);
      }
    }
};

int32_t main() {
  ios::sync_with_stdio(0); cin.tie(0);
  int n, q; cin >> n >> q;
  vector<int> a(n); for (int &x : a) cin >> x;
	fenwickTree ft1(n), ft0(n);

	for (int i = 0; i < n; i++) {
		if (i % 2) {
			ft1.update(i, a[i]);
		} else {
			ft0.update(i, a[i]);
		}
	}

	while (q--) {
		int op; cin >> op;
		if (op == 1) {
			int i, v; cin >> i >> v, i--;
			if (i % 2) {
				ft1.update(i, v);
			} else {
				ft0.update(i, v);
			}
		} else {
			int l, r; cin >> l >> r, l--, r--;
			if ((r - l + 1) % 2 == 0) {
				cout << "0\n";
			} else if (l % 2) {
				cout << ft1.range_query(l, r) << '\n';
			} else {
				cout << ft0.range_query(l, r) << '\n';
			}
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...