#include <bits/stdc++.h>
#define mk make_pair
#define pb emplace_back
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
return x * f;
}
const int maxn = 1e5 + 10;
int n, m, T[maxn];
struct ele { int id, v; } b[maxn];
namespace zeg {
int tot;
struct Node { int l, r; } t[maxn << 5];
struct val {
int ls, rs, s, l;
val operator + (const val x) const {
return val {
ls + (ls == l) * x.ls,
x.rs + (x.rs == x.l) * rs,
max({rs + x.ls, s, x.s}),
l + x.l
};
}
} v[maxn << 5];
void up(int p) { v[p] = v[t[p].l] + v[t[p].r]; }
int bld(int l, int r) {
int p = ++ tot, mi = l + r >> 1;
if (l ^ r) t[p].l = bld(l, mi), t[p].r = bld(mi + 1, r), up(p);
else v[p] = val {0, 0, 0, 1}; return p;
}
int upd(int p, int l, int r, int x) {
int p1 = ++ tot, mi = l + r >> 1;
t[p1] = t[p];
if (l == r) return v[p1] = val {1, 1, 1, 1}, p1;
if (x <= mi) t[p1].l = upd(t[p].l, l, mi, x);
else t[p1].r = upd(t[p].r, mi + 1, r, x);
return up(p1), p1;
}
val qry(int p, int l, int r, int x, int y) {
if (x <= l && r <= y) return v[p];
int mi = l + r >> 1;
val ans = val {0, 0, 0, 0};
if (x <= mi) ans = qry(t[p].l, l, mi, x, y);
if (mi < y) ans = qry(t[p].r, mi + 1, r, x, y) + ans;
return ans;
}
}
using namespace zeg;
int main() {
n = read();
for (int i = 1; i <= n; i ++) b[i] = ele {i, read()};
sort(b + 1, b + n + 1, [](ele a, ele b) { return a.v > b.v; });
T[0] = bld(1, n);
for (int i = 1; i <= n; i ++)
T[i] = upd(T[i - 1], 1, n, b[i].id);
m = read();
for (int i = 1; i <= m; i ++) {
int L = read(), R = read(), k = read();
int l = 1, r = n;
while (l + 1 < r) {
int mi = l + r >> 1;
if (qry(T[mi], 1, n, L, R).s >= k) r = mi;
else l = mi;
}
if (qry(T[l], 1, n, L, R).s >= k) printf("%d\n", b[l].v);
else printf("%d\n", b[r].v);
}
return 0;
}