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 <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long B = 1e18 + 1;
const int C = 5;
int n, c, q, arr[100009], go[100009];
vector<pair<int, int> > adj[100009];
long long dp[100009][C], par[100009][C];
long long dfs(int nd, int rem) {
  if (rem < 0) return 0;
  if (nd == n) return 1;
  long long& ret = dp[nd][rem];
  if (~ret) return ret;
  ret = 0;
  for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
       it != (adj[nd]).end(); it++)
    if (it->second <= rem)
      ret = min(B, ret + dfs(nd + 1 + it->second, rem - it->second));
  return ret;
}
vector<pair<int, int> > cur;
int rec(int nd, int rem, long long th, int pos) {
  if (nd == n) {
    for (__typeof((cur).begin()) it = (cur).begin(); it != (cur).end(); it++)
      reverse(arr + it->first, arr + it->second + 1);
    int ret = arr[pos];
    for (__typeof((cur).begin()) it = (cur).begin(); it != (cur).end(); it++)
      reverse(arr + it->first, arr + it->second + 1);
    cur.clear();
    return ret;
  }
  int st = nd + 1, en = n - 1;
  if (nd != go[nd] and th <= dfs(nd + 1, rem) and st <= en) {
    while (st + 1 < en) {
      int mid = (st + en) >> 1;
      if (th <= dfs(mid, rem))
        st = mid;
      else
        en = mid;
    }
    if (th <= dfs(en, rem))
      nd = en;
    else
      nd = st;
  }
  for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
       it != (adj[nd]).end(); it++) {
    if (th <= dfs(nd + 1 + it->second, rem - it->second)) {
      if (it->second) cur.push_back(make_pair(nd, nd + it->second));
      return rec(nd + 1 + it->second, rem - it->second, th, pos);
    } else
      th -= dfs(nd + 1 + it->second, rem - it->second);
  }
  return -1;
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    memset(dp, -1, sizeof dp);
    scanf("%d%d%d", &n, &c, &q);
    for (int i = 0; i < n; i++) scanf("%d", arr + i);
    for (int i = n - 1; i >= 0; i--) {
      adj[i].clear();
      for (int j = 0; j <= c; j++)
        if (i + j < n) adj[i].push_back(make_pair(arr[i + j], j));
      sort(adj[i].begin(), adj[i].end());
      if (adj[i][0].second == 0)
        go[i] = go[i + 1];
      else
        go[i] = i;
    }
    while (q--) {
      long long k;
      int a;
      scanf("%d%lld", &a, &k);
      printf("%d\n", rec(0, c, k, a - 1));
    }
  }
  return 0;
}
