#include <bits/stdc++.h>

using namespace std;
using ll = long long;
// #define int ll
using PII = pair<ll, ll>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()

template<typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template<typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template<typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }

template<typename T> vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts) {
    return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}
template<typename T,typename V> typename enable_if<is_class<T>::value==0>::type
fill_v(T &t, const V &v) { t=v; }
template<typename T,typename V> typename enable_if<is_class<T>::value!=0>::type
fill_v(T &t, const V &v ) { for(auto &e:t) fill_v(e,v); }

template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a) {
    out<<'('<<a.first<<','<<a.second<<')'; return out;
}
template<class T>
ostream &operator <<(ostream& out,const vector<T>& a){
    out<<'[';
    for(const T &i: a) out<<i<<',';
    out<<']';
    return out;
}
template<class T>
ostream &operator <<(ostream& out, const set<T>& a) {
    out<<'{';
    for(const T &i: a) out<<i<<',';
    out<<'}';
    return out;
}
template<class T, class S>
ostream &operator <<(ostream& out, const map<T,S>& a) {
    out<<'{';
    for(auto &i: a) out<<i<<',';
    out<<'}';
    return out;
}

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; // DRUL
const int INF = 1<<30;
const ll LLINF = 1LL<<60;
const ll MOD = 1000000007;

signed main(void)
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    ll n, k;
    cin >> n >> k;
    vector<ll> a(n);
    REP(i, n) cin >> a[i], a[i]--;

    // ダブリングで最初の方を削るパート
    vector<ll> last(200000);
    vector<vector<ll>> step(60, vector<ll>(n));
    for(ll i=2*n-1; i>=0; --i) {
        if(i < n) step[0][i] = last[a[i%n]]-i+1;
        last[a[i%n]] = i;
    }
    FOR(i, 1, 60) REP(j, n) {
        step[i][j] = step[i-1][j] + step[i-1][(j+step[i-1][j])%n];
        if(step[i][j] >= n*k) step[i][j] = LLINF;
    }
    ll x = 0;
    while(true) {
        bool update = false;
        for(ll i=59; i>=0; --i) {
            if(x + step[i][x%n] < n*k) {
                x += step[i][x%n];
                update = true;
                break;
            }
        }
        if(!update) break;
    }
    // 残ってる部分をシミュレーション
    stack<ll> st;
    set<ll> exist;
    FOR(i, x, n*k) {
        if(exist.find(a[i%n]) == exist.end()) {
            exist.insert(a[i%n]);
            st.push(a[i%n]);
        } else {
            while(st.size() && st.top()!=a[i%n]) {
                exist.erase(st.top());
                st.pop();
            }
            exist.erase(st.top());
            st.pop();
        }
    }
    // stackを逆順にして出力
    vector<ll> ans;
    while(st.size()) {
        ans.push_back(st.top());
        st.pop();
    }
    reverse(ALL(ans));
    REP(i, ans.size()) cout << ans[i]+1 << (i+1==ans.size()?'\n':' ');

    return 0;
}


Measured memory_bytes: 113124