#include <bits/stdc++.h>
using namespace std;
int n, m;
int tot = 0;
const int maxn = 1e5 + 10;
struct nod1 {
  int v;
  int id;
} q[maxn];
bool cmp(nod1 a, nod1 b) {
  if (a.v == b.v) return a.id < b.id;
  return a.v > b.v;
}
struct nod2 {
  int llen, rlen, mlen;
  int len;
} qq[maxn * 50];
int rt[maxn];
int ls[maxn * 50];
int rs[maxn * 50];
void pushup(int ro) {
  qq[ro].len = qq[ls[ro]].len + qq[rs[ro]].len;
  qq[ro].llen = qq[ls[ro]].llen;
  qq[ro].rlen = qq[rs[ro]].rlen;
  qq[ro].mlen = max(qq[ls[ro]].rlen, qq[rs[ro]].llen);
  qq[ro].mlen = max(qq[ro].mlen, qq[ls[ro]].rlen + qq[rs[ro]].llen);
  if (qq[ls[ro]].len == qq[ls[ro]].llen) {
    qq[ro].llen = max(qq[ro].llen, qq[ls[ro]].len + qq[rs[ro]].llen);
  }
  if (qq[rs[ro]].len == qq[rs[ro]].rlen) {
    qq[ro].rlen = max(qq[ro].rlen, qq[rs[ro]].len + qq[ls[ro]].rlen);
  }
  qq[ro].mlen = max(qq[ro].mlen, qq[ls[ro]].llen);
  qq[ro].mlen = max(qq[ro].mlen, qq[rs[ro]].llen);
  qq[ro].mlen = max(qq[ro].mlen, qq[ls[ro]].rlen);
  qq[ro].mlen = max(qq[ro].mlen, qq[rs[ro]].rlen);
  qq[ro].mlen = max(qq[ro].mlen, qq[ls[ro]].mlen);
  qq[ro].mlen = max(qq[ro].mlen, qq[rs[ro]].mlen);
  qq[ro].mlen = max(qq[ro].mlen, qq[ro].llen);
  qq[ro].mlen = max(qq[ro].mlen, qq[ro].rlen);
}
int build(int l, int r) {
  int dir = ++tot;
  if (l == r) {
    qq[dir] = {0, 0, 0, 1};
    return dir;
  }
  ls[dir] = build(l, ((l + r) >> 1));
  rs[dir] = build(((l + r) >> 1) + 1, r);
  pushup(dir);
  return dir;
}
int update(int L, int R, int l, int r, int root) {
  int dir = ++tot;
  ls[dir] = ls[root];
  rs[dir] = rs[root];
  qq[dir] = qq[root];
  if (L <= l && r <= R) {
    qq[dir] = {1, 1, 1, 1};
    return dir;
  }
  if (L <= ((l + r) >> 1)) {
    ls[dir] = update(L, R, l, ((l + r) >> 1), ls[dir]);
  }
  if (R > ((l + r) >> 1)) {
    rs[dir] = update(L, R, ((l + r) >> 1) + 1, r, rs[dir]);
  }
  pushup(dir);
  return dir;
}
nod2 query(int L, int R, int l, int r, int root) {
  if (L <= l && r <= R) {
    return qq[root];
  }
  nod2 o, o1, o2;
  o = {0, 0, 0, 0};
  o1 = {0, 0, 0, 0};
  o2 = {0, 0, 0, 0};
  if (L <= ((l + r) >> 1)) {
    o1 = query(L, R, l, ((l + r) >> 1), ls[root]);
  }
  if (R > ((l + r) >> 1)) {
    o2 = query(L, R, ((l + r) >> 1) + 1, r, rs[root]);
  }
  o.len = o1.len + o2.len;
  o.llen = o1.llen;
  o.rlen = o2.rlen;
  o.mlen = max(o1.rlen, o2.llen);
  o.mlen = max(o.mlen, o1.rlen + o2.llen);
  if (o1.len == o1.llen) {
    o.llen = max(o.llen, o1.len + o2.llen);
  }
  if (o2.len == o2.rlen) {
    o.rlen = max(o.rlen, o2.len + o1.rlen);
  }
  o.mlen = max(o.mlen, o1.llen);
  o.mlen = max(o.mlen, o2.llen);
  o.mlen = max(o.mlen, o1.rlen);
  o.mlen = max(o.mlen, o2.rlen);
  o.mlen = max(o.mlen, o1.mlen);
  o.mlen = max(o.mlen, o2.mlen);
  o.mlen = max(o.mlen, o.llen);
  o.mlen = max(o.mlen, o.rlen);
  return o;
}
int main() {
  scanf("%d", &n);
  tot = 0;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &q[i].v);
    q[i].id = i;
  }
  sort(q + 1, q + 1 + n, cmp);
  rt[0] = build(1, n);
  for (int i = 1; i <= n; ++i) {
    rt[i] = update(q[i].id, q[i].id, 1, n, rt[i - 1]);
  }
  scanf("%d", &m);
  int l, r, k;
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &l, &r, &k);
    int L = 1;
    int R = n;
    int ans = 0;
    int mid1 = 0;
    while (L <= R) {
      mid1 = ((L + R) >> 1);
      if (query(l, r, 1, n, rt[mid1]).mlen >= k) {
        R = mid1 - 1;
        ans = mid1;
      } else {
        L = mid1 + 1;
      }
    }
    printf("%d\n", q[ans].v);
  }
  return 0;
}
