17点49分改:
想了好久64M肯定够了,
发现问题 大小写L, l 打fan了
线段树已经过了 ma=-1 改成-inf 就行
-----------------------------------------
醉了 在acber 那个应用做了下 4分钟敲完线段树 mle了 我还敲了2次在那个应用上
到原题这里 还mle 就上st表了
// #include <bits/stdc++.h>
// using namespace std;
// const int N = 2e5 + 5;
// int n, m;
// int a[N << 2];
// void build(int l, int r, int rt) {
// if(l == r) {
// cin >> a[rt];
// return ;
// }
// int mid = l + r >> 1;
// build(l, mid, rt << 1);
// build(mid + 1, r, rt << 1 | 1);
// a[rt] = max(a[rt << 1], a[rt << 1 | 1]);
// }
// int query(int L, int R, int l, int r, int rt) {
// if(l <= L && R >= r) {
// return a[rt];
// }
// int mid = l + r >> 1, ma = -1;
// if(L <= mid) ma = max(ma, query(L, R, l, mid, rt << 1));
// if(R > mid) ma = max(ma, query(L,R,mid + 1, r,rt << 1 | 1));
// return ma;
// }
// int main() {
// cin >> n;
// build(1, n, 1);
// cin >> m;
// for(int i = 1, a, b; i <= m; i++) {
// cin >> a >> b;
// cout << query(a, b, 1, n, 1) << endl;
// }
// return 0;
// }
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 2e5 + 5;
int lg[maxn];
int a[maxn], f[maxn][30];
int n, m;
void STbuild() {
for(int i = 1; i <= n; i ++ ) f[i][0] = a[i];
int t = (lg[n]-1)/(lg[2]-1) + 1;
for(int j = 1; j < t; j ++ ) {
for(int i = 1; i <= n - (1 << j) + 1; i ++ ) {
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
}
int STquery(int l, int r){
int k = (lg[r - l + 1] - 1);
return max(f[l][k], f[r - (1 << k) + 1][k]);
}
int main() {
for(int i = 1; i < maxn; i ++){
lg[i] = lg[i - 1] + ((1 << lg[i - 1]) == i);
}
scanf("%d", &n);
for(int i = 1; i <= n; i ++){
scanf("%d", &a[i]);
}
scanf("%d", &m);
STbuild();
for(int i = 1; i <= m; i ++) {
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", STquery(x, y));
}
return 0;
}