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