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: Runtime Error)

#include <iostream>
#include<algorithm>
#include <vector>
#include <set>

using namespace std;

int N, A[200005];
long long int K;

int C[600005];

long long int NEXT[200005][50];

long long int INF = 99999999999999;

int vA(long long int K) {

	return A[K%N];
}

int main(void) {

	cin >> N >> K;

	for (int i = 0; i <= N - 1; i++) {
		cin >> A[i];
	}

	for (int i = 0; i <= 200000; i++) {
		C[i] = -1;  NEXT[i][0] = -1;
	}

	for (int i = 0; i < 2 * N; i++) {
		if (C[vA(i)] == -1) { C[vA(i)] = i; }
		else {
			if (NEXT[C[vA(i)]][0] == -1) { NEXT[C[vA(i)]][0] = i - C[vA(i)] + 1; }
			C[vA(i)] = i;
		}
	}

	for (int k = 0; k <= 42; k++) {
		for (int i = 0; i <= N - 1; i++) {
			NEXT[i][k + 1] = min(NEXT[(NEXT[i][k] + i) % N][k] + NEXT[i][k], INF);
		}
	}


	/*for (int k = 0; k <= 4; k++) {
		for (int i = 0; i < N; i++) {
			cout << "NEXT[" << i << "][" << k << "]= " << NEXT[i][k] << endl;
		}
	}*/

	long long int a = 0;

	int sign = 1;

	while (sign) {
		sign = 0;
		for (int k = 40; k >= 0; k--) {
			if (a + NEXT[a%N][k] <= K*N - 1) {
				a += NEXT[a%N][k];  sign = 1;  break;
			}
		}
		//cout << "a= " << a << endl;
	}

	//cout << "a= " << a << " vA= " << vA(a) << endl;

	vector<long long int> ans;
	set<long long int > S;

	for (long long int i = a; i <= K*N - 1; i++) {

		if (S.count(vA(i)) == 0) {
			ans.push_back(vA(i)); S.insert(vA(i));
		}
		else {
			int M = ans.size();
			while (S.find(vA(i))!=S.end()) {
				long long int tmp = ans[M - 1];
				ans.pop_back(); S.erase(tmp);
				M--;
				if (tmp == vA(i)) { break; }
			}
		}
	}


	for (int i = 0; i < (int)ans.size(); i++){
		if (i != 0) { cout << " "; }
		cout << ans[i];
	}cout << endl;
	return 0;
}