动态规划思想,倍增,nlogn复杂度

#include <bits/stdc++.h>
using namespace std;
#define MaxN 100002
int f[MaxN][22];
int __lg[100001] = { -1 };
int n, m;
inline int read() {
    int x = 0, f = 1;
    char ch = getchar();

    while (ch < '0' || ch > '9') {
        if (ch == '-')
            f = -1;

        ch = getchar();
    }

    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - 48;
        ch = getchar();
    }

    return x * f;
}
void solve() {
    cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        f[i][0] = read();
        __lg[i] = __lg[i / 2] + 1;
    }

    //f[j][i]表示从j开始到j+(1<<i)-1的区间

    //更新f数组
    for (int i = 1; i < 22; i++) {
        for (int j = 1; j + (1 << i) - 1 <= n; j++) {
            f[j][i] = max(f[j][i - 1], f[j + (1 << (i - 1))][i - 1]);
        }
    }

    //打印答案
    for (int i = 0; i < m; i++) {
        int l = read();
        int r = read();
        int s = __lg[r - l + 1];
        cout<< max(f[l][s], f[r - (1 << s) + 1][s])<<'\n';
    }

}