#include <iostream>
using namespace std;
// f[i, j] = [i, 2^j-1] 的最大值 即: 从i开始, 连续 2^j 个数的最大值。
const int N = 1e5 + 5;
int arr[N];
int ST[N][18];
int log2[N] = {-1};
int read()
{
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-') f = 1; c = getchar();
}
while(c >= '0' && c <= '9')
{
x = x * 10 + c - 48;
c = getchar();
}
return x*f;
}
int main()
{
int n = read(), m = read();
for(int i = 1; i <= n; i++)
{
arr[i] = read();
log2[i] = log2[i/2] + 1;
ST[i][0] = arr[i];
}
for(int j = 1; j <= log2[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 l, r, k;
for(int i = 0; i < m; i++)
{
l = read();
r = read();
k = log2[r-l+1];
printf("%d\n", max(ST[l][k], ST[r - (1<<k)+1][k]));
}
return 0;
}
ST表模板
最新推荐文章于 2025-06-15 22:44:13 发布

455





