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;

#define mem(a, w) memset(a, w, sizeof(a))
#define all(a) a.begin(), a.end()
#define mp make_pair
#define fi first
#define se second

typedef long long ll;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;

const int maxc = 4 + 5;
const int maxn = 30000 + 5;

struct data {
    int l, r;
    ll w;
    data() { }
    data(const int &_l, const int &_r, const ll &_w) {
        l = _l; r = _r; w = _w;
        return;
    }
};

int N, Cost, Q, A[maxn];

deque<data> Dq[maxc], tl, tr;
vector<pii> Rev;
int Front[maxc][maxn];
ll Sum[maxc][maxn * maxc];

ll C(int n, int m) {
    if(n < m) return 0;
    ll ret = 1;
    for(int i = 0; i < m; ++i)
        ret = ret * (n - i);
    for(int i = 1; i <= m; ++i)
        ret = ret / i;
    return ret;
}

ll ways(int len, int c) {
    ll ret = 0;
    for(int i = 0; i <= c; ++i) {
        if(len <= 1) ret += (i == 0);
        else ret += C(len - 1, i);
    }
    return ret;
}

bool cmp(data x, data y) {
    return A[x.r] < A[y.r];
}

data F(int p, int c, ll k) {
    int res = 0;
    int i = Front[c][p];
    int l = i + 1, r = Dq[c].size();
    while(l <= r) {
        int mid = l + r >> 1;
        if(Sum[c][mid] - Sum[c][i] >= k) {
            res = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }

    return data(Dq[c][res - 1].l, Dq[c][res - 1].r, Sum[c][res - 1] - Sum[c][i]);
}

void solve() {
    scanf("%d%d%d", &N, &Cost, &Q);
    for(int i = 1; i <= N; ++i)
        scanf("%d", &A[i]);

    for(int c = 1; c <= Cost; ++c) {
        Dq[c].clear();
        for(int i = 1; i <= N; ++i)
            Front[c][i] = 0;
        
        Dq[c].push_back(data(N, N, 1));
        for(int i = N - 1; i >= 1; --i) {
            while(!tl.empty()) tl.pop_back();
            while(!tr.empty()) tr.pop_back();

            for(int j = 1; j <= min(c, N - i); ++j) {
                ll w = ways(N - (i + j), c - j);
                if(A[i] < A[i + j]) {
                    tr.push_back( data(i, i + j, w) );
                }
                else {
                    tl.push_front( data(i, i + j, w) );
                    ++Front[c][i + 1];
                }
            }
            sort(all(tl), cmp);
            sort(all(tr), cmp);
            while(!tl.empty()) {
                Dq[c].push_front(tl.back());
                tl.pop_back();
            }
            while(!tr.empty()) {
                Dq[c].push_back(tr.front());
                tr.pop_front();
            }
        }
        
        // printf("c: %d\n", c);
        // for(int i = 0; i < Dq[c].size(); ++i) {
        //     printf("(%d, %d, %lld)\n", Dq[c][i].l, Dq[c][i].r, Dq[c][i].w); 
        // }
        // puts("");
        
        for(int i = 1; i <= N; ++i)
            Front[c][i] += Front[c][i - 1];
        for(int i = 1; i <= Dq[c].size(); ++i)
            Sum[c][i] = Sum[c][i - 1] + Dq[c][i - 1].w;
    }
    ll limit = ways(N, Cost);
    while(Q--) {
        int pos; ll rk;
        scanf("%d%lld", &pos, &rk);
        if(rk > limit) {
            puts("-1");
            continue;
        }
        
        while(!Rev.empty()) Rev.pop_back();

        int c = Cost, p = 1;
        while(c && p <= N) {
            data tmp = F(p, c, rk);
            //assert(rk - tmp.w > 0);
            Rev.push_back(make_pair(tmp.l, tmp.r));
            rk -= tmp.w;
            p = tmp.r + 1;
            c -= (tmp.r - tmp.l);
        }

        bool flag = 0;
        for(auto x: Rev) {
            // printf("(%d, %d)\n", x.fi, x.se);
            if(x.fi <= pos && pos <= x.se) {
                flag = 1;
                printf("%d\n", A[x.se - (pos - x.fi)]);
                break;
            }
        }
        if(!flag) printf("%d\n", A[pos]);
    }

    return;
}

int main() {
    int T; scanf("%d", &T);
    while(T--) {
        solve();
    }
    return 0;
}
/*
1
6 4 4
6 5 4 3 1 2
*/