#include <bits/stdc++.h>
using namespace std;
struct gauss {
  vector<int> vet;
  gauss() {}
  gauss(int val) {
    if (val) vet.push_back(val);
  }
  bool add(int val) {
    int sig = 20;
    for (int i = 0; i < (int)vet.size(); i++) {
      while (!(vet[i] & (1 << sig))) sig--;
      if (val & (1 << sig)) val ^= vet[i];
    }
    if (!val) return false;
    sig = 20;
    while (!(val & (1 << sig))) sig--;
    for (int &x : vet)
      if (x & (1 << sig)) x ^= val;
    vet.push_back(val);
    for (int i = (int)vet.size() - 2; i >= 0 && vet[i] < vet[i + 1]; i--) {
      swap(vet[i], vet[i + 1]);
    }
    return true;
  }
  gauss merge(const gauss &o) const {
    gauss a = *this;
    a.vet.insert(a.vet.end(), o.vet.begin(), o.vet.end());
    int sig = 20;
    int i = 0;
    for (i = 0; i < (int)a.vet.size() && sig >= 0; sig--) {
      int t = i;
      while (t < (int)a.vet.size() && !(a.vet[t] & (1 << sig))) t++;
      if (t == (int)a.vet.size()) continue;
      swap(a.vet[t], a.vet[i]);
      for (int j = 0; j < (int)a.vet.size(); j++)
        if (i != j) {
          if (a.vet[j] & (1 << sig)) {
            a.vet[j] ^= a.vet[i];
          }
        }
      i++;
    }
    while ((int)a.vet.size() > i) a.vet.pop_back();
    while (a.vet.size() and a.vet.back() == 0) a.vet.pop_back();
    return a;
  }
};
const int N = 500005;
int n;
int c[N];
int lg(int x) { return 31 - __builtin_clz(x); }
int ans[N];
int l[N], r[N];
vector<int> qu[N];
gauss vet[N];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", c + i);
  int q;
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    scanf("%d %d", l + i, r + i);
    qu[r[i]].emplace_back(i);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = i; j >= 1; j--) {
      if (!vet[j].add(c[i])) break;
    }
    for (int id : qu[i]) {
      for (int x : vet[l[id]].vet) ans[id] ^= x;
    }
  }
  for (int i = 0; i < q; i++) printf("%d\n", ans[i]);
}
