#include <bits/stdc++.h>
typedef long long LLONG;
typedef std::pair<int, int> PII;
typedef std::map<int, int> MII;
typedef std::pair<PII, int> PIIAI;
typedef std::vector<int> VI;
typedef std::vector<PII> VPII;
#ifdef TDEBUG
#define tout(x) std::cerr << #x << " = " << x << std::endl;
#define tdebug(args...) { std::cerr << "(" << #args << ") = > "; dbg, args; std::cerr << std::endl; }
#else
#define tout(x)
#define tdebug(args...)
#endif
struct Debuger {
template<typename T>
Debuger& operator, (const T& v) {
std::cerr << v << " ";
return *this;
}
} dbg;
template<typename T>inline void scaf(T&v) {
char ch = getchar();
int sgn = 1;
for (; '-' != ch && (ch < '0' || ch > '9'); ch = getchar());
if ('-' == ch) sgn = -1, v = 0;
else v = ch - '0';
for (ch = getchar(); ch >= '0' && ch <= '9'; ch = getchar()) v = (v << 1) + (v << 3) + ch - '0';
v *= sgn;
}
const int N = 2e5 + 10;
const double eps = 1e-8;
struct QueryParam {
int l, k, idx;
QueryParam() { }
QueryParam(int ll, int kk, int idxx) {
l = ll;
k = kk;
idx = idxx;
}
};
std::vector<QueryParam> qs[N];
struct SegTree {
int ls, rs, votes;
int mx, mn;
void assign(int lss, int rss, int votess) {
ls = lss;
rs = rss;
votes = votess;
}
void setMx(int mxx, int mnn) {
tdebug(mxx, mnn);
mx = mxx;
mn = mnn;
}
static int stTotoal;
} tree[N * 10];
int troot[N];
int SegTree::stTotoal = 0;
inline void init(int n) {
SegTree::stTotoal = 0;
for (int i = 0; i <= n; ++i) {
qs[i].clear();
}
}
inline int build(int l, int r) {
int v = SegTree::stTotoal++;
tree[v].votes = 0;
tree[v].setMx(0, N);
if (l < r) {
int mid = l + r >> 1;
tree[v].ls = build(l, mid);
tree[v].rs = build(mid + 1, r);
}
return v;
}
inline int modify(int l, int r, int x, int last) {
int v = SegTree::stTotoal++;
int curVotes = tree[last].votes + 1;
tree[v].assign(tree[last].ls, tree[last].rs, curVotes);
if (l < r) {
int mid = l + r >> 1;
if (mid >= x) {
tree[v].ls = modify(l, mid, x, tree[last].ls);
} else {
tree[v].rs = modify(mid + 1, r, x, tree[last].rs);
}
int ls = tree[v].ls, rs = tree[v].rs;
int mxx = std::max(tree[ls].mx, tree[rs].mx);
int mnn = std::min(tree[ls].mn, tree[rs].mn);
tree[v].setMx(std::max(tree[last].mx, mxx), std::min(tree[last].mn, mnn));
} else {
tree[v].setMx(std::max(tree[last].mx, curVotes), std::min(tree[last].mn, curVotes));
}
return v;
}
inline int query(int l, int r, int tl, int tr, int k) {
int cv = tree[tr].votes - tree[tl].votes;
tdebug(tree[tr].mx, tree[tr].mn);
if (tree[tr].mx < k || tree[tr].mn > k) { return 0; }
if (cv < k) { return 0; }
if (l >= r) {
if (cv == k) { return l; }
return 0;
} else {
int mid = l + r >> 1;
int rlt = query(l, mid, tree[tl].ls, tree[tr].ls, k);
if (0 == rlt) {
rlt = query(mid + 1, r, tree[tl].rs, tree[tr].rs, k);
}
return rlt;
}
return 0;
}
int main() {
int t;
for (scaf(t); t--;) {
int n, g;
scaf(n);
init(n);
troot[0] = build(1, n);
for (int i = 1; i <= n; ++i) {
scaf(g);
troot[i] = modify(1, n, g + 1, troot[i - 1]);
}
scaf(g);
int l, r, k;
for (int i = 0; i < g; ++i) {
scaf(l); scaf(r); scaf(k);
printf("%d\n", query(1, n, troot[l], troot[r + 1], k) - 1);
}
}
return 0;
}