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++ (GCC 9.2.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define pi 3.141592653589793238
#define int long long
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

set<int>s[200005];
int mm[200005];

signed main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);  
  cout.tie(0);   

  #ifndef ONLINE_JUDGE
      if(fopen("INPUT.txt","r"))
      {
      freopen ("INPUT.txt" , "r" , stdin);
      freopen ("OUTPUT.txt" , "w" , stdout);
      }
  #endif  

  int n,k;
  cin>>n>>k;
  int a[n];
  
  for(int i=0;i<n;i++)
  {
    cin>>a[i];
    s[a[i]].insert(i);    
  }
  int cnt=1;
  int z=0;
  while (cnt<k && mm[z]==0)
  {
    mm[z]=cnt;
    auto j=s[a[z]].lower_bound(z+1);
    if(j==s[a[z]].end())
    {
      if(k==cnt)
        break;
      j=s[a[z]].lower_bound(0);
      z=*j+1;
      cnt++;
      if(z==n)
      {
        z=0;
        cnt++;        
      }
      if(cnt==k)
      {
        break;
      }
    }
    else
    {
      z=*j+1;
      if(z==n)
      {
        z=0;
        cnt++;
      }
    }    
  }

  if(cnt==k+1)
    return 0;
  if(mm[z]==0)
  {
    if(z==n)
      return 0;
    vector<int>res;
    for(int i=z;i<n;i++)
    {
      auto j=s[a[i]].lower_bound(i+1);
      if(j!=s[a[i]].end())
      {
        i=*j;
        continue;
      }
      else
      {
        res.push_back(a[i]);
      }
    }
    for(auto i:res)
      cout<<i<<" ";      
    return 0;
  }
  else
  {
    int per=cnt-mm[z];
    k-=mm[z];
    k%=per;
  }

  while (k>0)
  {
    auto j=s[a[z]].lower_bound(z+1);
    if(j==s[a[z]].end())
    {
      j=s[a[z]].lower_bound(0);
      z=*j+1;
      k--;
      if(z==n)
      {
        z=0;
        k--;
        if(k==-1)
          return 0;
      }
      if(k==0)
        break;
    }
    else
    {
      z=*j+1;
      if(z==n)
      {
        z=0;
        k--;
      }
    }    
  }

    if(z==n)
      return 0;
    vector<int>res;
    for(int i=z;i<n;i++)
    {
      auto j=s[a[i]].lower_bound(i+1);
      if(j!=s[a[i]].end())
      {
        i=*j;
        continue;
      }
      else
      {
        res.push_back(a[i]);
      }
    }
    for(auto i:res)
      cout<<i<<" ";      

}