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

/***************************************************************
	File name: E.cpp
	Author: ljfcnyali
	Create time: 2021年01月06日 星期三 11时34分15秒
***************************************************************/
#include<bits/stdc++.h>
 
using namespace std;
 
#define REP(i, a, b) for ( int i = (a), _end_ = (b); i <= _end_; ++ i ) 
#define mem(a) memset ( (a), 0, sizeof ( a ) ) 
#define str(a) strlen ( a ) 
#define pii pair<int, int>
#define int long long
typedef long long LL;
 
const int maxn = 3e5 + 10;
const int INF = 1e18;
 
int T, n, c, q, a[maxn], f[maxn][5], g[maxn][5][5], h[maxn][5][5], dp[maxn][5], C[maxn][5];
vector<pii> Ans;
 
inline int Find(int pos, int now, int y)
{
    int l = pos, r = n, ans = n + 1;
    while ( l <= r ) 
    {
        int Mid = l + r >> 1;
        if ( y <= dp[Mid][now] - dp[pos - 1][now] || y > dp[Mid][now] - dp[pos - 1][now] + h[Mid][now][0] )
        {
            ans = Mid; r = Mid - 1;
        }
        else l = Mid + 1;
    }
    return ans;
}
 
signed main()
{
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    scanf("%lld", &T); n = maxn - 10; 
    C[0][0] = 1; REP(i, 1, n) { C[i][0] = 1; REP(j, 1, 4) C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; }
    REP(i, 1, n) REP(j, 0, 4) REP(k, 0, j) f[i][j] += C[i - 1][k]; REP(i, 0, 4) f[0][i] = 1;
    while ( T -- ) 
    {
        scanf("%lld%lld%lld", &n, &c, &q);
        REP(i, 1, n) scanf("%lld", &a[i]);
 
        REP(i, 1, n) REP(now, 0, c)
        {
            vector<pii> p; p.clear(); REP(j, i, min(n, i + now)) p.push_back(pii(a[j], j));
            sort(p.begin(), p.end()); int sum = 0, k = 0;
            for ( auto it : p ) 
            {
                int 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 -- ) 
        {
            int x, y, now = c; scanf("%lld%lld", &x, &y);
            if ( y > f[n][c] ) { puts("-1"); continue ; } 
            int 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];
                assert(y>=0);
                REP(i, 0, c)
                {
                    int t = g[nxt][now][i];
                    if ( y <= h[nxt][now][t - nxt] )
                    {
                        Ans.push_back(pii(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;
}