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,a,b) for(int i = (a); i <= (b); i++)
#define rng(a) a.begin(), a.end()
#define ina(n,a) cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]
#define sz(x) (int)(x).size()
#define se second
#define fi first
#define prev            coyhhhhhhyoc    
#define next          sdNNNmNNNNNNNmds  
#define y0           hNNNNy_yNNNNNN_sNh
#define y1          mNNNNNdtdNNNNNNtsNNm
#define yn          mNNNNNNNNy___smNNNms
#define tm            oooooosyysooooot 
#define read               tyhyt        
#define rank              ytmNmo         
#define index              yyy
#define pb push_back
#define pcnt __builtin_popcountll
#define rrep(i,a,b) for(int i = (b); i >= (a); i--)
#define rall(x,a) for(auto x : a)
#define MOD 1000000007
#define endl "\n"
#define int long long
typedef long long ll;
using namespace std;

const int N = 444444;
int a[N], lp[N], fo[N], fn[N], has[N], lop[N];
int n, k;

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;
    rep(i, 1, n) {
        cin >> a[i];
    }
    rep(i, n + 1, 2 * n) {
        a[i] = a[i - n];
    }
    bool lu = false;
    rep(i, 1, 2 * n) {
        if(lp[a[i]]) {
            fo[lp[a[i]]] = i - lp[a[i]];
        } else if(i == n) {
            lu = true;
        }
        lp[a[i]] = i;
    }
    rrep(i, 1, n) {
        int np = i + fo[i] + 1;
        if(np <= n) {
            np = fn[np];
        }
        fn[i] = np;
    }
    rep(i, 1, n) {
        fn[i] -= n;
    }
    int pos = 1;
    rep(o, 1, k - 1) {
        if((pos == n && lu) || pos > n) {
            int rem = k - o + (pos > n) + 1;
            if(rem & 1) {
                cout << a[n] << endl;
            }
            return 0;
        }
        if(lop[pos]) {
            int diff = o - lop[pos];
            int rem = k - o;
            int cnt = rem / diff;
            o += cnt * diff;
        }
        lop[pos] = o;
        pos = fn[pos];
    }
    vector<int> ans;
    while(pos <= n) {
        int x = a[pos];
        if(has[x]) {
            while(ans.back() != x) {
                int y = ans.back();
                ans.pop_back();
                has[y] = false;
            }
            ans.pop_back();
            has[x] = false;
        } else {
            ans.pb(x);
            has[x] = true;
        }
        pos++;
    }
    rall(x, ans) {
        cout << x << " ";
    }
    cout << endl;
    return 0;
}