#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int maxn = 1 << 19, bit = 20;
int n, c[maxn], q, dat[2 * maxn][bit], res[bit];
inline void insert(int* a, int x, int hi) {
  for (int i = (hi)-1; i >= (0); --i) {
    if (x & (1 << i)) {
      if (a[i])
        x ^= a[i];
      else {
        for (int j = (i)-1; j >= (0); --j)
          if (x & (1 << j)) x ^= a[j];
        a[i] = x;
        for (int j = (i + 1); j < (bit); ++j)
          if (a[j] & (1 << i)) a[j] ^= a[i];
        break;
      }
    }
    if (!x) break;
  }
}
void init(int l, int r, int idx) {
  if (l + 1 == r)
    insert(dat[idx], c[l], bit);
  else {
    init(l, (l + r >> 1), (idx * 2 + 1)), init((l + r >> 1), r, (idx * 2 + 2));
    memcpy(dat[idx], dat[(idx * 2 + 1)], sizeof dat[idx]);
    for (int i = (0); i < (bit); ++i)
      insert(dat[idx], dat[(idx * 2 + 2)][i], i + 1);
  }
}
void qr(int l, int r, int idx, int a, int b) {
  if (b <= l || r <= a)
    return;
  else if (a <= l && r <= b) {
    for (int i = (0); i < (bit); ++i) insert(res, dat[idx][i], i + 1);
  } else
    qr(l, (l + r >> 1), (idx * 2 + 1), a, b),
        qr((l + r >> 1), r, (idx * 2 + 2), a, b);
}
int main() {
  cin.tie(0), cout.tie(0), ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = (0); i < (n); ++i) cin >> c[i];
  memset(dat, (0), sizeof dat);
  init(0, n, 0);
  cin >> q;
  for (int i = (0); i < (q); ++i) {
    int l, r;
    cin >> l >> r, --l;
    memset(res, (0), sizeof res);
    qr(0, n, 0, l, r);
    int mx = 0;
    for (int j = (0); j < (bit); ++j) mx ^= res[j];
    cout << mx << '\n';
  }
}
