前缀线性基模板
F. Ivan and Burgers
/*
Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
inline ll read() {
ll f = 1, x = 0;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f * x;
}
const int N = 5e5 + 10;
struct PrefixLinearBasis {
int base[N][64], pos[N][64], num, n = 30;
void init() {
for(int i = 0; i < N; i++) {
memset(base[i], 0, sizeof base[i]);
memset(pos[i], 0, sizeof pos[i]);
num = 0;
}
}
void add(int x) {
num++;
for(int i = 0; i <= n; i++) {
base[num][i] = base[num - 1][i];
pos[num][i] = pos[num - 1][i];
}
int p = num;
for(int i = n; ~i; i--) {
if(x >> i & 1) {
if(base[num][i] == 0) {
base[num][i] = x;
pos[num][i] = p;
return ;
}
if(pos[num][i] < p) {
swap(pos[num][i], p);
swap(base[num][i], x);
}
x ^= base[num][i];
}
}
}
int query_max(int l, int r) {
ll ans = 0;
for(int i = n; ~i; i--) {
if(pos[r][i] < l) continue;
if((ans ^ base[r][i]) > ans) {
ans ^= base[r][i];
}
}
return ans;
}
int query_min(int l, int r) {
for(int i = 0; i <= n; i++) {
if(pos[r][i] < l) continue;
if(base[r][i]) return base[r][i];
}
}
}ans;
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n = read();
for(int i = 1; i <= n; i++) {
ll x = read();
ans.add(x);
}
int m = read();
for(int i = 1; i <= m; i++) {
int l = read(), r = read();
printf("%d\n", ans.query_max(l, r));
}
return 0;
}