Problem:
Score : 700 points

Problem Statement

We have a sequence of N \times K integers: X=(X_0,X_1,\cdots,X_{N \times K-1}).
Its elements are represented by another sequence of N integers: A=(A_0,A_1,\cdots,A_{N-1}). For each pair i, j (0 \leq i \leq K-1,\ 0 \leq j \leq N-1), X_{i \times N + j}=A_j holds.

Snuke has an integer sequence s, which is initially empty.
For each i=0,1,2,\cdots,N \times K-1, in this order, he will perform the following operation:

If s does not contain X_i: add X_i to the end of s.

If s does contain X_i: repeatedly delete the element at the end of s until s no longer contains X_i. Note that, in this case, we do not add X_i to the end of s.

Find the elements of s after Snuke finished the operations.

Constraints

1 \leq N \leq 2 \times 10^5

1 \leq K \leq 10^{12}

1 \leq A_i \leq 2 \times 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
A_0 A_1 \cdots A_{N-1}

Output

Print the elements of s after Snuke finished the operations, in order from beginning to end, with spaces in between.

Sample Input 1

3 2
1 2 3

Sample Output 1

2 3

In this case, X=(1,2,3,1,2,3).
We will perform the operations as follows:

i=0: s does not contain 1, so we add 1 to the end of s, resulting in s=(1).

i=1: s does not contain 2, so we add 2 to the end of s, resulting in s=(1,2).

i=2: s does not contain 3, so we add 3 to the end of s, resulting in s=(1,2,3).

i=3: s does contain 1, so we repeatedly delete the element at the end of s as long as s contains 1, which causes the following changes to s: (1,2,3)→(1,2)→(1)→().

i=4: s does not contain 2, so we add 2 to the end of s, resulting in s=(2).

i=5: s does not contain 3, so we add 3 to the end of s, resulting in s=(2,3).

Sample Input 2

5 10
1 2 3 2 3

Sample Output 2

3

Sample Input 3

6 1000000000000
1 1 2 2 3 3

Sample Output 3

s may be empty in the end.

Sample Input 4

11 97
3 1 4 1 5 9 2 6 5 3 5

Sample Output 4

9 2 6

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (n); i++)
#define int long long
#define double long double
#define all(a) a.begin(), a.end()
#define debug(x) cout << #x << " = " << x << endl;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;

signed main(void){
    
    int n, k;
    cin >> n >> k;

    vector<int> a(n);
    rep(i, n)cin >> a[i];

    //ループするから、それをうまく使うしかない
    //n回で1回はかならず全て消える
    //試さなきゃいけないのはせいぜいn回
    //ある数字が先頭に来た時、それが消えるのは次に同じ数字が来た時
    //もしその数字が答えに影響しないなら、それが消えるまでの過程は関係ない
    //1, 2, 3, 4, 1, 5, 4のとき1, 5, 4, 1, 2, 3, 4と先頭の文字は変わる
    //次同じ文字が出てくるまでの距離の合計が1回のループの操作回数(上の例だと5+8+5+4+8+8+4=42)
    //vectorにその数字が次に出てくる場所とそこまでの距離をを入れておく
    //変なループになったりしないか？　いや、それは関係ないか

    vector<int> b(n * 2), c(n), d(n);
    rep(i, n)b[i] = b[i + n] = a[i];

    map<int, int> mp;
    rep(i, n * 2){
        if(mp.find(b[i]) == mp.end()){
            mp[b[i]] = i % n;
        } else {
            c[mp[b[i]]] = i % n;
            mp[b[i]] = i % n;
        }
    }

    rep(i, n){
        if(c[i] == i)d[i] = n + 1;
        else d[i] = (c[i] - i + n) % n + 1;
    }

    int sum = 0;
    vector<bool> used(n, false);
    int pos = 0;
    while(true){
        if(used[pos])break;
        sum += d[pos];
        used[pos] = true;
        pos = (c[pos] + 1) % n;
    }

    k *= n;
    k %= sum;

    pos = 0;
    while(true){
        if(k < d[pos])break;
        k -= d[pos];
        pos = (c[pos] + 1) % n;
    }

    int now = 0;
    mp.clear();
    vector<int> ans(n);
    rep(i, k){
        if(mp.find(b[pos]) == mp.end()){
            mp[b[pos]] = now;
            ans[now++] = b[pos++];
        } else {
            now = mp[b[pos]];
            mp.erase(b[pos]);
        }
    }

    rep(i, now){
        if(i > 0)cout << ' ';
        cout << ans[i];
    }
    cout << endl;

}