// // Created by darian on 17.06.24. // #include using namespace std; using ll = long long; void update(int x, ll u, vector &tree, int n) { x--; x += n; tree[x] = u; x /= 2; for (; x >= 1; x /= 2) { tree[x] = tree[2*x] ^ tree[2*x + 1]; } } vector construct(vector &input) { int n = input.size(); vector output(2 * n); for (int i = n; i < 2 * n; i++) { output[i] = input[i - n]; } for (int i = n - 1; i >= 1; i --) { output[i] = output[2 * i] ^ output[2 * i + 1]; } return output; } ll query(int a, int b, vector &tree, int n) { a--; b--; a += n; b += n; ll s = 0; while (a <= b) { if (a % 2 == 1) { s ^= tree[a]; a++; } if (b % 2 == 0) { s ^= tree[b]; b--; } a /= 2; b /= 2; } return s; } int main() { int n; cin >> n; int q; cin >> q; vector input(n); for (int i{}; i < n; i++) cin >> input[i]; auto seg = construct(input); for (int i{}; i < q; i++) { int a, b; cin >> a >> b; cout << query(a, b, seg, n) << endl; } }