#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int n;
int root[maxn], ls[maxn], rs[maxn];
int sz = 0;
int sum[maxn];
int num[maxn];
int b[maxn];
void build(int & rt, int l, int r){
rt = ++sz;
sum[rt] = 0;
if(l == r) return;
int mid = (l+r)/2;
build(ls[rt], l, mid);
build(rs[rt], mid+1, r);
}
void update(int &now, int last, int val ,int l, int r){
now = ++sz;
ls[now] = ls[last];
rs[now] = rs[last];
sum[now] = sum[last]+1;
if(l == r) return;
int mid = (l+r)/2;
if(val<=mid) update(ls[now], ls[last], val, l, mid);
else update(rs[now], rs[last], val ,mid+1, r);
}
int query(int x, int y, int k, int l ,int r){
if(l == r) return l;
int cnt = sum[ls[y]]-sum[ls[x]];
int mid = (l+r)/2;
if(cnt>=k) query(ls[x], ls[y], k, l ,mid);
else query(rs[x], rs[y], cnt-k, mid+1, r);
}
int main()
{
int n;
while(~scanf("%d", &n)){
for(int i=1; i<=n; i++){
scanf("%d", &num[i]);
b[i] = num[i];
}
sort(b+1, b+n+1);
int sz = unique(b+1, b+n+1)-(b+1);
for(int i=1; i<=n; i++) num[i] = lower_bound(b+1, b+1+sz, num[i])-b;
build(root[0], 1, n);
for(int i=1; i<=n; i++) update(root[i], root[i-1], num[i], 1, n);
int q;
scanf("%d", &q);
for(int i=1; i<=q; i++){
int x, y, k;
scanf("%d%d%d", &x, &y, &k);
printf("%d\n", b[query(root[x-1], root[y], k, 1, n)]);
}
}
return 0;
}
主席树真的好优美啊~