前两个点和最后一个点过了:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int st[N][22], MyPow[22] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152};
int MyMax(int a, int b) {
return a > b ? a : b;
}
int MyLog(int a) {
int ans = 0;
while (a)
a >>= 1;
return ans;
}
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;
}
inline void write(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
int main() {
int n, m;
n = read();
m = read();
for (int i = 1; i <= n; i++)
st[i][0] = read();
for (int j = 1; j < 22; j++) {
for (int i = 1; i < N; i++) {
if (i + MyPow[j - 1] <= n) {
st[i][j] = MyMax(st[i][j - 1], st[i + MyPow[j - 1]][j - 1]);
} else {
st[i][j] = st[i][j - 1];
}
}
}
for (int i = 1; i <= m; i++) {
int l, r, M = -N, p;
l = read();
r = read();
while (l <= r) {
// cout<<st[l][(int)log2(r - l + 1)]<<"\n";
p = st[l][MyLog(r - l + 1)];
if (p > M)
M = p;
if (l < r)
l += MyLog(r - l + 1) + 1;
else
l = r + 1;
}
write(M);
putchar('\n');
}
return 0;
}