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;
long long dp[30001][5][3];
vector<vector<int>> nxt[5][3];
vector<int> v;
int n;
long long solve(int pos, int c, int x) {
  if (pos >= n || x > 1) return dp[pos][c][x] = 1;
  if (dp[pos][c][x] != -1) return dp[pos][c][x];
  long long ret = 0;
  vector<pair<int, int>> auxv;
  v.reserve(c + 1);
  for (int i = (0); i < (c + 1); i++)
    if (i + pos < n) {
      auxv.push_back(make_pair(v[i + pos], i));
    }
  assert(((int)auxv.size()) > 0);
  sort(auxv.begin(), auxv.end());
  for (auto it = auxv.begin(); it != auxv.end(); it++) {
    nxt[c][x][pos].push_back(it->second);
    ret += solve(pos + it->second + 1, c - it->second, x + (it->second > 0));
  }
  return dp[pos][c][x] = min(ret, 1000100100100100100LL);
}
map<long long, vector<pair<int, int>>> mq;
vector<int> ans;
map<long long, vector<pair<int, int>>>::iterator curite;
long long passed;
void solve(int pos, int c, int x, pair<int, int> a, pair<int, int> b) {
  if (curite == mq.end()) return;
  if (nxt[c][x][pos].empty()) {
    assert(curite->first == passed + 1);
    for (auto it = curite->second.begin(); it != curite->second.end(); it++) {
      int p = it->first, id = it->second;
      if (p >= a.first && p <= a.second) {
        p -= a.first;
        ans[id] = v[a.second - p];
      } else if (p >= b.first && p <= b.second) {
        p -= b.first;
        ans[id] = v[b.second - p];
      } else
        ans[id] = v[p];
    }
    passed++;
    curite++;
    return;
  }
  for (auto it = nxt[c][x][pos].begin(); it != nxt[c][x][pos].end(); it++) {
    if (passed + dp[pos + *it + 1][c - *it][x + (*it > 0)] < curite->first)
      passed += dp[pos + *it + 1][c - *it][x + (*it > 0)];
    else {
      if (a.first == -1 && *it > 0)
        solve(pos + *it + 1, c - *it, x + (*it > 0), make_pair(pos, pos + *it),
              b);
      else if (*it > 0) {
        assert(b.first == -1);
        solve(pos + *it + 1, c - *it, x + (*it > 0), a,
              make_pair(pos, pos + *it));
      } else
        solve(pos + *it + 1, c - *it, x + (*it > 0), a, b);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int t;
  cin >> t;
  for (int T = (0); T < (t); T++) {
    int c, q;
    cin >> n >> c >> q;
    mq.clear();
    v = vector<int>(n);
    for (int i = (0); i < (n); i++) cin >> v[i];
    memset(dp, -1, sizeof(dp));
    for (int i = (0); i < (5); i++)
      for (int j = (0); j < (3); j++) {
        nxt[i][j].clear();
        nxt[i][j] = vector<vector<int>>(n + 1);
        for (int k = (0); k < (n); k++) nxt[i][j][k].reserve(6);
      }
    long long cant = solve(0, c, 0);
    for (int i = (0); i < (q); i++) {
      int pos;
      long long j;
      cin >> pos >> j;
      pos--;
      mq[j].push_back(make_pair(pos, i));
    }
    ans = vector<int>(q, -1);
    passed = 0;
    curite = mq.begin();
    solve(0, c, 0, {-1, -1}, {-1, -1});
    for (int i = (0); i < (q); i++) cout << ans[i] << '\n';
  }
  return 0;
}
