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 maxn = 3e5 + 10;
const long long INF = 1e18;
long long T, n, c, q, a[maxn], f[maxn][5], g[maxn][5][5], h[maxn][5][5],
    dp[maxn][5], C[maxn][5];
vector<pair<long long, long long> > Ans;
inline long long Find(long long pos, long long now, long long y) {
  long long l = pos, r = n, ans = n + 1;
  while (l <= r) {
    long long Mid = l + r >> 1;
    if (y <= dp[Mid][now] - dp[pos - 1][now]) {
      ans = Mid;
      r = Mid - 1;
    } else
      l = Mid + 1;
  }
  return ans;
}
signed main() {
  scanf("%lld", &T);
  n = maxn - 10;
  C[0][0] = 1;
  for (long long i = (1), _end_ = (n); i <= _end_; ++i) {
    C[i][0] = 1;
    for (long long j = (1), _end_ = (4); j <= _end_; ++j)
      C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
  }
  for (long long i = (1), _end_ = (n); i <= _end_; ++i)
    for (long long j = (0), _end_ = (4); j <= _end_; ++j)
      for (long long k = (0), _end_ = (j); k <= _end_; ++k)
        f[i][j] += C[i - 1][k];
  for (long long i = (0), _end_ = (4); i <= _end_; ++i) f[0][i] = 1;
  while (T--) {
    scanf("%lld%lld%lld", &n, &c, &q);
    for (long long i = (1), _end_ = (n); i <= _end_; ++i) scanf("%lld", &a[i]);
    for (long long i = (1), _end_ = (n); i <= _end_; ++i)
      for (long long now = (0), _end_ = (c); now <= _end_; ++now) {
        vector<pair<long long, long long> > p;
        p.clear();
        for (long long j = (i), _end_ = (min(n, i + now)); j <= _end_; ++j)
          p.push_back(pair<long long, long long>(a[j], j));
        sort(p.begin(), p.end());
        long long sum = 0, k = 0;
        for (auto it : p) {
          long long j = it.second;
          g[i][now][k++] = j;
          h[i][now][j - i] = f[n - j][now - j + i];
          if (j > i)
            sum += f[n - j][now - j + i];
          else
            dp[i][now] = dp[i - 1][now] + sum;
        }
      }
    while (q--) {
      long long x, y, now = c;
      scanf("%lld%lld", &x, &y);
      if (y > f[n][c]) {
        puts("-1");
        continue;
      }
      long long pos = 1, nxt;
      Ans.clear();
      while (pos <= n) {
        nxt = Find(pos, now, y);
        if (nxt == n + 1) break;
        y -= dp[nxt - 1][now] - dp[pos - 1][now];
        for (long long i = (0), _end_ = (c); i <= _end_; ++i) {
          long long t = g[nxt][now][i];
          if (y <= h[nxt][now][t - nxt]) {
            Ans.push_back(pair<long long, long long>(nxt, t));
            now -= t - nxt;
            pos = t + 1;
            break;
          }
          y -= h[nxt][now][t - nxt];
        }
      }
      for (auto it : Ans)
        if (it.first <= x && x <= it.second) {
          printf("%lld\n", a[it.second - x + it.first]);
          goto Finish;
        }
      printf("%lld\n", a[x]);
    Finish:;
    }
  }
  return 0;
}
