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)

/**
 * Author: AcFunction
 * Date:   2019-09-04 21:48:14
 * Email:  3486942970@qq.com
**/

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double 

#define fi first
#define se second
#define MP make_pair
#define pii pair <int, int>
#define pil pair <int, ll> 
#define pli pair <ll, int>
#define pll pair <ll, ll>  

#define All(x) x.begin(), x.end()
#define pb push_back
#define pf push_front

#define ms0(x) memset(x, 0, sizeof(x))
#define ms1(x) memset(x, -1, sizeof(x))

#define oiu cerr << "Yes!" << endl; 
#define O(x) cerr << #x << ": " << x << endl;  

template <typename T> void printarr(T a[], int b, int e) {
  if(b > e) return ; 
  for(int i = b; i < e; i++) cout << a[i] << " "; 
  cout << a[e] << " " << endl; 
} 

template <typename T> int chkmax(T &x, const T &y) {
  return x < y ? x = y, 1 : 0; 
}

template <typename T> int chkmin(T &x, const T &y) {
  return x > y ? x = y, 1 : 0; 
}

const int N = 500100; 

int n;
int nxt[N], fir[N], pos[N], a[N], ans[N], cnt;
ll k;  

int main() {
  scanf("%d %lld", &n, &k);
  for(int i = 1; i <= n; i++) {
    scanf("%d", &a[i]); 
    if(!fir[a[i]]) {
      fir[a[i]] = i;
      pos[a[i]] = i;  
    }
    else {
      nxt[pos[a[i]]] = i;
      if(nxt[pos[i]] > n) 
        nxt[pos[i]] -= n;  
      pos[a[i]] = i;  
    }
    nxt[i] = fir[a[i]]; 
  }
  int u = 1; ll num = 0; 
  while(1) {
    if(nxt[u] > u) {
      num += nxt[u] - u + 1; 
    }
    else num += n - (u - nxt[u] - 1); 
    u = nxt[u] + 1;
    if(u > n) u -= n;  
    if(u == 1) break ; 
  }
  num /= n; 
  k = k % num; 
  if(!k) return 0; 
  u = 1; num = 0; 
  k *= n; 
  while(1) {
    if(nxt[u] > u) {
      num += nxt[u] - u + 1; 
      if(num > k) {
        num -= nxt[u] - u + 1; 
        for(int j = u; j <= u + k - num - 1; j++) {
          if(nxt[j] > j && nxt[j] <= u + k - num - 1) {
            j = nxt[j] + 1; continue ; 
          }
          printf("%d ", a[j]); 
        } 
        return 0; 
      }
    }
    else {
      num += n - (u - nxt[u] - 1); 
      if(num > k) {
        num -= n - (u - nxt[u] - 1); 
        for(int j = u; j <= u + k - num - 1; j++) {
          int t = j; if(t > n) t -= n; 
          ans[++cnt] = a[t]; 
        } 
        for(int i = 1; i <= cnt; i++) pos[ans[i]] = fir[ans[i]] = nxt[i] = 0; 
        for(int i = 1; i <= cnt; i++) {
          if(!fir[a[i]]) {
            fir[ans[i]] = i;
            pos[ans[i]] = i;  
          }
          else {
            nxt[pos[ans[i]]] = i;
            if(nxt[pos[i]] > n) 
              nxt[pos[i]] -= n;  
            pos[ans[i]] = i;  
          }
          nxt[i] = fir[ans[i]]; 
        }
        for(int i = 1; i <= cnt; i++) {
          if(nxt[i] > i) {
            i = nxt[i] + 1; 
          }
          else printf("%d ", ans[i]); 
        }
        return 0; 
      }
    } u = nxt[u] + 1; 
  }
  return 0; 
}