前缀线性基模板

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;
}