1 #include <iostream>
2 #include <algorithm>
3 #include <cstring>
4
5 using namespace std;
6 const int maxn = 10000 + 5;
7 int a[maxn];
8 int f[maxn][15];
9
10 void rmq(int cnt){
11 memset(f, 0, sizeof(f));
12 for (int i = 1; i <= cnt; i++){
13 f[i][0] = a[i];
14 }
15
16 //O(nlogn)
17 for (int j = 1; j < 15; j++){
18 for (int i = 1; i <= cnt; i++){
19 if (i + (1 << j) - 1 <= cnt){
20 f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
21 }
22 }
23 }
24 }
25
26
27 int Query(int x, int y){
28 int k = 0;
29 while ((1 << (k + 1)) <= y - x + 1)
30 k++;
31 return max(f[x][k], f[y - (1 << k) + 1][k]);
32 }
33
34 int main(){
35 ios::sync_with_stdio(false);
36
37 int n;
38 cin >> n;
39 for (int i = 1; i <= n; i++){
40 cin >> a[i];
41 }
42 rmq(n);
43 int m;
44 cin >> m;
45 while (m--){
46 int x, y;
47 cin >> x >> y;
48 x++, y++;
49 int ans = Query(x, y);
50 cout << ans << endl;
51 }
52
53 //system("pause");
54 return 0;
55 }