#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;
}