//静态区间最值 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; int ST[maxn][25]; int a[maxn]; void STinit(int n) { for (int i = 1; i <= n; i++) { ST[i][0] = a[i]; } for (int j = 1; (1 << j) <= n; j++) { for (int i = 1; i + (1 << j) - 1 <= n; i++) { ST[i][j] = max(ST[i][j - 1] , ST[i + (1 << (j - 1))][j - 1]); } } } int query(int l, int r) { int k = (int)(log((double)(r - l + 1)) / log(2.0));//转为以2为底数 return max(ST[l][k], ST[r - (1 << k) + 1][k]); } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } STinit(n); while (m--) { int l, r; scanf("%d%d", &l, &r); printf("%d\n", query(l, r)); } }
来源:https://www.cnblogs.com/ucprer/p/12274695.html