代码如下
数组特意开大了
#include <bits/stdc++.h>
using namespace std;
int n, q;
int f[1000010][30];
int log_2(int x)
{
int res = 0;
int y = 1;
while (y < x)
{
y <<= 1;
res++;
}
return res;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
cin >> f[i][0];
}
int lgn = log_2(n);
for (int j = 1; j <= lgn; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
while (q--)
{
int i, j;
cin >> i >> j;
int len = j - i + 1;
int lgl = log_2(len) - 1;
cout << max(f[i][lgl], f[j - (1 << lgl) + 1][lgl]) << '\n';
}
return 0;
}