/*
* Problem :: 2910 / 빈도 정렬
*
* Kind :: Sorting
*
* Insight
* - 주어진 수열에서 각 수의 등장 횟수, 맨 처음 등장한 인덱스를 Map 에 저장
* + 위의 정보를 토대로 주어진 수열을 정렬
* # 이게 전부인데...?
*
* Point
* - 처음 문제를 풀었을 때 너무 끙끙대서 풀었나?
* + 4달 전에 비해 성장했군 (흐뭇)
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
struct Info { int cnt, ord; };
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, C;
cin >> N >> C;
int A[N];
for (int i=0; i<N; i++)
cin >> A[i];
// Process
map<int,Info> M; /* 각 수의 등장 횟수, 맨 첫번 인덱스 정보를 저장 */
for (int i=0; i<N; i++) {
int n = A[i];
/* 수 n 이 처음으로 등장했다면 */
if (M.find(n) == M.end()) {
M[n].ord = i; /* 맨 첫번 인덱스 저장 */
} M[n].cnt++; /* 등장 횟수 증가 */
}
/* 주어진 수열 정렬 */
sort(A, A+N, [&M](int u, int v){
Info ui = M[u], vi = M[v];
/* 등장 횟수의 내림차순으로, 맨 첫번 인덱스의 오름차순으로 */
return make_pair(-ui.cnt, ui.ord) < make_pair(-vi.cnt, vi.ord);
});
// Control : Output
for (int e : A) {
cout << e << ' ';
}
}
// Helper Functions
/* None */