1
10 2 20
8 5 2 4 10 3 9 7 1 6
5 10
3 17
6 31
3 46
10 42
7 19
9 36
7 3
3 13
8 32
10 25
9 34
10 34
6 33
3 9
2 17
4 5
10 44
9 15
5 40
 1
47 1 47
40 45 19 10 44 33 47 12 2 46 16 23 3 14 21 28 31 42 22 18 35 38 24 25 36 32 4 34 5 20 37 39 6 9 1 7 29 8 17 27 30 11 13 41 15 43 26
39 25
41 24
32 30
10 6
30 13
24 35
41 17
31 31
9 44
21 8
43 23
8 5
29 13
8 4
47 20
22 10
37 27
17 39
43 23
14 42
46 19
43 24
30 31
24 35
31 13
31 32
20 9
3 2
20 9
14 7
7 3
21 36
32 30
47 19
11 43
6 2
31 31
26 12
47 20
2 1
40 24
16 40
45 21
36 28
36 28
17 38
30 31
 1
1 1 4
1
1 1
1 2
1 3
1 4
 1
10 1 1
10 4 6 5 7 9 8 1 3 2
6 10

3
2
7
10
6
7
7
7
5
1
6
6
1
9
4
4
4
1
1
3
 27
27
37
16
20
24
11
20
46
35
11
2
34
47
26
24
7
28
11
3
26
13
37
24
37
37
22
10
22
14
47
38
37
43
23
33
20
4
26
19
30
21
43
1
1
42
37
 1
-1
-1
-1
 9

#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
struct Node {
  int l, r;
  long long w;
};
Node dq[5][400066];
int n, c, q;
int p[30066];
int sum[5][200066];
long long sumw[5][400066];
int l[5], r[5];
vector<pair<int, int> > vec;
long long f(int len, int c) {
  long long ret = 1, tmp = 1;
  for (int i = 1; i <= min(len - 1, c); i++) {
    tmp = tmp * (len - i) / i;
    ret += tmp;
  }
  return ret;
}
bool cmp(Node& lhs, Node& rhs) { return p[lhs.r] < p[rhs.r]; }
Node F(int i, int c, long long rank) {
  int L = l[c] + sum[c][i], R = r[c] - 1;
  while (L < R) {
    int mid = (L + R) >> 1;
    if (sumw[c][mid] - sumw[c][sum[c][i] + l[c] - 1] >= rank)
      R = mid;
    else
      L = mid + 1;
  }
  return Node{dq[c][L].l, dq[c][L].r,
              sumw[c][L - 1] - sumw[c][sum[c][i] + l[c] - 1]};
}
int main() {
  int _;
  scanf("%d", &_);
  while (_--) {
    scanf("%d%d%d", &n, &c, &q);
    for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
    for (int i = 0; i <= c; i++)
      for (int j = 0; j <= n; j++) sum[i][j] = 0;
    for (int s = 1; s <= c; s++) {
      l[s] = 200033, r[s] = 200033;
      dq[s][r[s]++] = Node{n, n, 1};
      for (int i = n - 1; i > 0; i--) {
        int L = 0, R = 0;
        for (int j = i + 1; j <= min(n, i + s); j++) {
          if (p[j] < p[i]) {
            L++;
            dq[s][l[s] - L] = Node{i, j, f(n - j, s - (j - i))};
            sum[s][i + 1]++;
          } else {
            dq[s][r[s] + R] = Node{i, j, f(n - j, s - (j - i))};
            R++;
          }
        }
        l[s] -= L;
        sort(dq[s] + l[s], dq[s] + l[s] + L, cmp);
        r[s] += R;
        sort(dq[s] + r[s] - R, dq[s] + r[s], cmp);
      }
      for (int i = 1; i <= n; i++) sum[s][i] += sum[s][i - 1];
      sumw[s][l[s] - 1] = 0;
      for (int i = l[s]; i < r[s]; i++)
        sumw[s][i] = sumw[s][i - 1] + dq[s][i].w;
    }
    long long lim = f(n, c);
    while (q--) {
      int x, y;
      scanf("%d%d", &x, &y);
      vec.clear();
      if (y > lim) {
        puts("-1");
        continue;
      }
      int pos = 1, w = c;
      while (pos < n && w > 0) {
        auto node = F(pos, w, y);
        vec.push_back(make_pair(node.l, node.r));
        pos = node.r + 1;
        w -= (node.r - node.l);
        y -= node.w;
      }
      bool ok = false;
      for (auto node : vec) {
        if (node.first <= x && node.second >= x) {
          ok = true;
          int ans = p[node.first + node.second - x];
          printf("%d\n", ans);
          break;
        }
      }
      if (!ok) printf("%d\n", p[x]);
    }
  }
  return 0;
}
