template <typename T> inlinevoidread(T &a){ char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x; } template <typename T, typename ...Argv> inlinevoidread(T &a, Argv &...argv){ read(a), read(argv...); }
double ln2 = log(2); int power2[MAXlog2_n + 10]; voidevapower2(int n){ power2[0] = 1; for (int i = 1; i <= n; ++i) { power2[i] = power2[i - 1] * 2; } }
int mx[MAXn + 10][MAXlog2_n + 2]; voidbuild(int n, int *a){ int log2_n = log(n) / ln2; for (int i = 1; i <= n; ++i) { mx[i][0] = a[i]; } for (int i = 1; i <= log2_n; ++i) { for (int j = 1, topj = n - power2[i] + 1; j <= topj; ++j) { mx[j][i] = max(mx[j][i - 1], mx[j + power2[i - 1]][i - 1]); } } } intquerymax(int l, int r){ int loglen = log(r - l + 1) / ln2; returnmax(mx[l][loglen], mx[r - power2[loglen] + 1][loglen]); }
int n, m; int a[MAXn + 10]; signedmain(){ read(n, m); evapower2(log(n) / ln2); for (int i = 1; i <= n; ++i) { read(a[i]); } build(n, a); for (int i = 1, l, r; i <= m; ++i) { read(l, r); printf("%d\n", querymax(l, r)); } return0; }