ST表
const int N = ${1:5e5} + 5;int lg[N];
void init() { lg[0] = -1; for (int i = 1; i < N; i++) { lg[i] = lg[i >> 1] + 1; }}
struct ST { int n; vector<vector<int>> st; void init(vector<int> &c) { n = c.size(); st.assign(n, vector<int>(lg[n] + 1, 0)); for (int i = 0; i < n; i++) { st[i][0] = c[i]; } for (int j = 1; j <= lg[n]; j++) { int pj = 1 << j - 1; for (int i = 0; i + pj < n; i++) { st[i][j] = max(st[i][j - 1], st[i + pj][j - 1]); } } } int query(int l, int r) { int d = r - l + 1; int q = lg[d]; return max(st[l][q], st[r - (1 << q) + 1][q]); }};// 下标应为从 0 开始// 千万记得 init()