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 MAXN 30007

int n , mx_cost , q ;
int a[ MAXN ] ;

long long cnt[ MAXN ][ 5 ] ;

vector < pair < int , long long > > v[ MAXN ][ 5 ] ;

long long up[ MAXN ][ 5 ] ;
long long down[ MAXN ][ 5 ] ;

void init ( ) {
    for ( int i = 0 ; i < 5 ; ++ i ) { cnt[ 0 ][ i ] = 1 ; }
    for ( int i = 1 ; i < MAXN ; ++ i ) {
        for ( int j = 0 ; j < 5 ; ++ j ) {
            for ( int t = 0 ; t <= j ; ++ t ) {
                if ( i - ( t + 1 ) >= 0 ) {
                    cnt[ i ][ j ] += cnt[ i - ( t + 1 ) ][ j - t ] ;
                }
            }
        }
    }
}


void input ( ) {
    scanf ( "%d%d%d" , &n , &mx_cost , &q ) ;
    for ( int i = 1 ; i <= n ; ++ i ) {
        scanf ( "%d" , &a[ i ] ) ;
    }
}

int get ( int pos , int lft , long long where , long long total ) {
    int l , r , mid ;
    l = pos ; r = n + 1 ;
    while ( r - l > 3 ) {
        mid = ( l + r ) / 2 ;
        long long sm = down[ mid ][ lft ] - down[ pos - 1 ][ lft ] ;
        long long lg = up[ mid ][ lft ] - up[ pos - 1 ][ lft ] ;
        if ( sm >= where || lg >= ( total - where + 1 ) ) { r = mid ; }
        else { l = mid ; }
    }
    while ( l <= n ) {
        long long sm = down[ l ][ lft ] - down[ pos - 1 ][ lft ] ;
        long long lg = up[ l ][ lft ] - up[ pos - 1 ][ lft ] ;
        if ( sm < where && lg < ( total - where + 1 ) ) { ++ l ; }
        else { break ; }
    }
    return l ;
}


void solve ( ) {
    for ( int i = 1 ; i <= n + 1 ; ++ i ) {
        for ( int j = 0 ; j < 5 ; ++ j ) {
            up[ i ][ j ] = down[ i ][ j ] = 0 ;
            v[ i ][ j ].clear ( ) ;
        }
    }
    for ( int i = 1 ; i <= n ; ++ i ) {
        for ( int j = 0 ; j < 5 ; ++ j ) {
            for ( int t = 0 ; t <= j ; ++ t ) {
                if ( i + t <= n ) {
                    v[ i ][ j ].push_back ( { t , cnt[ n - ( i + t ) ][ j - t ] } ) ;
                }
            }
            sort ( v[ i ][ j ].begin ( ) , v[ i ][ j ].end ( ) ,
                   [ & ] ( pair < int , long long > x , pair < int , long long > y ) {
                       return a[ i + x.first ] < a[ i + y.first ] ;
                   }
                   ) ;
            int sz = v[ i ][ j ].size ( ) ;
            bool fl = false ;
            for ( int t = 0 ; t < sz ; ++ t ) {
                if ( v[ i ][ j ][ t ].first == 0 ) { fl = true ; continue ; }
                if ( fl == false ) { down[ i ][ j ] += v[ i ][ j ][ t ].second ; }
                else { up[ i ][ j ] += v[ i ][ j ][ t ].second ; }
            }
        }
    }
    for ( int i = 1 ; i <= n + 1 ; ++ i ) {
        for ( int j = 0 ; j < 5 ; ++ j ) {
            up[ i ][ j ] += up[ i - 1 ][ j ] ;
            down[ i ][ j ] += down[ i - 1 ][ j ] ;
        }
    }

    while ( q -- ) {
        long long where ;
        int id ;
        scanf ( "%d%lld" , &id , &where ) ;
        if ( where > cnt[ n ][ mx_cost ] ) {
            printf ( "-1\n" ) ;
            continue ;
        }
        long long total = cnt[ n ][ mx_cost ] ;
        int pos = 1 ;
        int lft = mx_cost ;
        while ( 1 ) {
            int nxt_skip = get ( pos , lft , where , total ) ;
            if ( nxt_skip > id ) {
                printf ( "%d\n" , a[ id ] ) ;
                break ;
            }
            total = cnt[ ( n - nxt_skip + 1 ) ][ lft ] ;
            where -= down[ nxt_skip - 1 ][ lft ] - down[ pos - 1 ][ lft ] ;
            pos = nxt_skip ;

            int sz = v[ pos ][ lft ].size ( ) ;
            bool fl = false ;
            for ( int i = 0 ; i < sz ; ++ i ) {
                if ( where > v[ pos ][ lft ][ i ].second ) {
                    where -= v[ pos ][ lft ][ i ].second ;
                    continue ;
                }
                total = v[ pos ][ lft ][ i ].second ;
                int len = v[ pos ][ lft ][ i ].first ;
                if ( pos + len >= id ) {
                    fl = true ;
                    printf ( "%d\n" , a[ pos + len - ( id - pos ) ] ) ;
                }
                else { pos += len + 1 ; lft -= len ; }
                break ;
            }
            if ( fl == true ) { break ; }
        }
    }
}


int main ( ) {
    ios_base :: sync_with_stdio ( false ) ;
    cin.tie ( NULL ) ;
    int t ;
    // cin >> t ;
    // t = 1 ;
    init ( ) ;
    scanf ( "%d" , &t ) ;
    while ( t -- ) { 
        input ( ) ;
        solve ( ) ;
    }
    return 0 ;
}
