import std.stdio, std.conv, std.string, std.array, std.range, std.algorithm, std.container;
import std.math, std.random, std.bigint, std.datetime, std.format;
void main(string[] args){ if(args.length > 1) if(args[1] == "-debug") DEBUG = 1; solve(); }
void log()(){ writeln(""); } void log(T, A ...)(T t, lazy A a){ if(DEBUG) write(t, " "), log(a); } bool DEBUG = 0; 
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }
// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- //

void solve(){
	int n = read.to!int;
	long k = read.to!long;
	
	int[] as;
	foreach(i; 0 .. n) as ~= read.to!int;
	log("as:", as);
	
	int[][int] aq;
	foreach(int i, a; as){
		if(a !in aq) aq[a] = [];
		aq[a] ~= i;
	}
	log("aq:", aq);
	
	int[int] next; // next[i] = i2 ならば i は i2 でクリアされる
	int[] aqks = aq.keys;
	foreach(a; aqks){
		for(int ix = 0; ix < aq[a].length; ix ++){
			if(ix < aq[a].length - 1) next[aq[a][ix]] = (aq[a][ix + 1] + 1) % n;
			else next[aq[a][ix]] = (aq[a][0] + 1) % n;
		}
	}
	log("next:", next);
	
	int[int] last; // last[j] は j ( = 0 , ...) 回目の周期が実質どこから始まるか (=最後にクリアしたときの i に対して、i + 1)
	int cnt = 0; // 何周でもとにもどるか
	for(int i = 0; ; i = next[i]){
		if(next[i] <= i + 1){
			last[cnt] = i;
			cnt += 1;
		}
		if(next[i] == 0) break;
	}
	log("last:", last);
	log("cnt:", cnt);
	
	int k2 = (k % cnt).to!int; // 実質、何周すればよいか
	log("k2:", k2);
	
	if(k2 == 0){
		"".writeln;
		return;
	}
	
	int i2 = last[k2 - 1]; // 実質、ここから始める
	log("i2:", i2);
	
	int[] ans;
	for(int i = i2; i < n; ){
		if(next[i] == 0) break;
		else if(next[i] <= i + 1){
			ans ~= as[i];
			i += 1;
		}
		else i = next[i];
	}
	
	ans.map!(to!string).array.join(" ").writeln;
}
	
