设f[i][j]为第i层的第j个数,可得 f[i][j] = f[i - 1][j - 1] ^ f[i - 1][j]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5005;
ll dp[maxn][maxn], f[maxn][maxn];
int main() {
    int n, m, l, r;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld\n", &f[i][i]);
        dp[i][i] = f[i][i];
    }
    for (int l = 2; l <= n; l++) {
        for (int i = 1; i + l - 1 <= n; i++) {
            int j = i + l - 1;
            f[i][j] = f[i][j - 1] ^ f[i + 1][j];
        }
    }
    for (int l = 2; l <= n; l++) {
        for (int i = 1; i + l - 1 <= n; i++) {
            int j = i + l - 1;
            dp[i][j] = max(f[i][j], max(dp[i][j - 1], dp[i + 1][j]));
        }
    }
    scanf("%d", &m);
    while(m--) {
        scanf("%d%d", &l, &r);
        printf("%lld\n", dp[l][r]);
    }
    return 0;
}