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;
template <typename _T>
inline void read(_T &f) {
  f = 0;
  _T fu = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') {
      fu = -1;
    }
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    f = (f << 3) + (f << 1) + (c & 15);
    c = getchar();
  }
  f *= fu;
}
template <typename T>
void print(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x < 10)
    putchar(x + 48);
  else
    print(x / 10), putchar(x % 10 + 48);
}
template <typename T>
void print(T x, char t) {
  print(x);
  putchar(t);
}
const int N = 30005;
struct atom {
  int a, b;
  atom(int k1 = 0, int k2 = 0) : a(k1), b(k2) {}
};
long long f[N][5], sum[N][5][16];
int a[N];
int T, n, c, q;
long long getf(atom x) { return f[x.a][x.b]; }
void addf(atom x, long long y) { f[x.a][x.b] += y; }
int main() {
  read(T);
  while (T--) {
    memset(f, 0, sizeof(f));
    read(n);
    read(c);
    read(q);
    for (int i = 1; i <= n; i++) read(a[i]);
    for (int i = 0; i <= 4; i++) f[n + 1][i] = 1;
    for (int i = n; i >= 1; i--) {
      for (int j = 0; j <= 4; j++) {
        for (int k = 0; k <= j && i + k <= n; k++) {
          if (a[i + k] < a[i]) {
            sum[i][j][0] += getf(atom(i + k + 1, j - k));
          }
          addf(atom(i, j), getf(atom(i + k + 1, j - k)));
        }
        for (int k = 1; k <= 15; k++) {
          sum[i][j][k] = sum[i][j][k - 1];
          if (i + (1 << (k - 1)) <= n)
            sum[i][j][k] += sum[i + (1 << (k - 1))][j][k - 1];
        }
      }
    }
    while (q--) {
      int pos;
      long long rk;
      read(pos);
      read(rk);
      if (f[1][c] < rk) {
        print(-1, '\n');
        continue;
      }
      atom now = atom(1, c);
      while (1) {
        long long ss = 0;
        for (int i = 15; i >= 0; i--) {
          if (now.a + (1 << i) <= n + 1 && ss + sum[now.a][now.b][i] < rk &&
              rk <= ss + sum[now.a][now.b][i] +
                        getf(atom(now.a + (1 << i), now.b))) {
            ss += sum[now.a][now.b][i];
            now.a += (1 << i);
          }
        }
        if (now.a > pos) {
          print(a[pos], '\n');
          break;
        }
        rk -= ss;
        vector<pair<int, int> > seq;
        for (int i = 0; i <= now.b && now.a + i <= n; i++) {
          seq.push_back(make_pair(a[now.a + i], i));
        }
        sort(seq.begin(), seq.end());
        int tmp = now.a;
        for (int i = 0; i < (int)seq.size(); i++) {
          if (rk <=
              getf(atom(now.a + seq[i].second + 1, now.b - seq[i].second))) {
            now = atom(now.a + seq[i].second + 1, now.b - seq[i].second);
            break;
          }
          rk -= getf(atom(now.a + seq[i].second + 1, now.b - seq[i].second));
        }
        if (now.a > pos) {
          print(a[now.a - 1 - (pos - tmp)], '\n');
          break;
        }
      }
    }
  }
  return 0;
}
