rt,样例过不了。
#include <iostream>
#include <vector>
#include <map>
#include <math.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define inf 0x3f3f3f3f
#define minf 0x3f
#define inp(x) cin>>x
#define otp(x) cout<<x
#define otp_nl(x) cout<<x<<"\n"
#define otp_sp(x) cout<<x<<" "
#define int long long
#define veci vector<int>
#define str string
#define pb(x) push_back(x)
#define fr(k,len) for(k=0;k<len;k++)
#define nfr(k,len) for(int k=0;k<len;k++)
#define ret return
#define db long double
#define all(x) x.begin(),x.end()
namespace my_stl {
}
int qpow(int a, int t, int p) {
a %= p;
int b[64];
b[0] = a;
nfr(i, 63)b[i + 1] = (b[i] * b[i]) % p;
int ans = 1;
nfr(i, 64) {
if (t & (1 << i)) {
ans *= b[i];
ans %= p;
}
}
ret ans;
}
int gcd(int a, int b) {
ret (b ? (gcd(b, a % b)) : a);
}
int invp(int a, int p) {
ret qpow(a, p - 2, p);
}
int x, y;
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 exgcd(int a, int b, bool f) {
if (f)
x = 0, y = 0;
if (!b) {
x = 1;
y = 0;
return;
}
exgcd(b, a % b, false);
int tx = x;
x = y;
y = tx - a / b * y;
}
int inv(int a, int p) {
exgcd(a, p, true);
return (x + p) % p;
}
int logn[131072];
int st[131072][17];
int a[131072];
void logninit() {
for (int i = 0; i < 131072; i++) {
for (int j = 0; (1 << j) <= i; j++)
logn[i] = j;
}
}
void lineinit(int l) {
int gap = 1 << l;
deque<int> dq;
for (int i = 0; i < 131072; i++) {
while (dq.size() && a[dq.back()] < a[i])
dq.pop_back();
dq.push_back(i);
if (i >= gap) {
while (dq.front() <= i - gap)
dq.pop_front();
st[i - gap][l] = a[dq.front()];
}
}
}
void stinit() {
for (int i = 0; i < 131072; i++)
st[i][0] = a[i];
for (int i = 1; i < 19; i++)
lineinit(i);
}
void solve() {
int n = read(), m = read();
for (int i = 0; i < n; i++)
a[i] = read();
logninit();
stinit();
for (int i = 0; i < m; i++) {
int l, r;
cin >> l >> r;
l--;
int lne = logn[r - l];
printf("%d\n", max(st[l][lne], st[r - (1 << lne)][lne]));
}
/*for (int i = 0; i < n; i++) {
for (int j = 0; j <= logn[n]; j++) {
cout << st[i][j] << ' ';
}
cout << endl;
}*/
ret;
}
signed main() {
int t = 1;
nfr(i, t) {
solve();
}
ret 0;
}