#include <bits/stdc++.h>
using namespace std;
int convert(vector<int> &arr, int x) {
return (lower_bound(arr.begin(), arr.end(), x) - arr.begin());
}
vector<pair<int, int>> countOccurrences(vector<int> &arr) {
vector<pair<int, int>> cntcnt;
for (int i = 0; i < arr.size(); ++i) {
int temp2 = arr[i];
int index2 = i;
int count2 = 0;
while (temp2 == arr[index2] && index2 < arr.size()) {
count2++;
index2++;
}
cntcnt.emplace_back(temp2, count2);
i = index2 - 1;
}
return cntcnt;
}
void runcase() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
vector<int> temp = arr;
vector<int> temp2 = arr;
vector<int> temp3 = arr;
sort(temp.begin(), temp.end());
temp.resize(unique(temp.begin(), temp.end()) - temp.begin());
for (int i = 0; i < n; ++i) {
arr[i] = convert(temp, arr[i]);
}
sort(arr.begin(), arr.end());
vector<int> arr2 = arr;
arr.resize(unique(arr.begin(), arr.end()) - arr.begin());
// day ban dau
cout << "Dãy ban đầu: " << "\n";
for (int i = 0; i < temp2.size(); ++i) {
cout << temp2[i] << " ";
}
cout << "\n";
sort(temp3.begin(), temp3.end());
cout << "Dãy ban đầu sắp xếp: " << "\n";
for (int i = 0; i < temp3.size(); ++i) {
cout << temp3[i] << " ";
}
cout << "\n";
cout << "Dãy ban đầu sắp xếp khi rời rạc hóa: " << "\n";
for (int i = 0; i < arr2.size(); ++i) {
cout << arr2[i] << " ";
}
cout << "\n";
cout << "Dãy ban đầu sắp xếp khi loại phần tử trùng: " << "\n";
for (int i = 0; i < temp.size(); ++i) {
cout << temp[i] << " ";
}
cout << "\n";
cout << "Dãy ban đầu sắp xếp khi rời rạc hóa và loại phần tử trùng (luôn có dạng 0, 1, 2, 3...): " << "\n";
for (int i = 0; i < arr.size(); ++i) {
cout << arr[i] << " ";
}
cout << "\n";
map<int, long long int> myMap;
for (int i = 0; i < arr.size(); ++i) {
myMap[i] = temp[i];
}
cout << "Mapping giữa dãy ban đầu và rời rạc hóa" << "\n";
for (int i = 0; i < myMap.size(); ++i) {
cout << "{" << i << ":" << myMap[i] << "}" << " ";
}
cout << "\n";
vector<pair<int, int>> cntOcc = countOccurrences(arr2);
sort(cntOcc.begin(), cntOcc.end());
cout << "Mapping giữa dãy ban đầu và số lượng lặp" << "\n";
for (int i = 0; i < cntOcc.size(); ++i) {
cout << "{" << cntOcc[i].first << ":" << cntOcc[i].second << "}" << " ";
}
cout << "\n";
map<int, long long int> mySumMap;
for (int i = 0; i < arr.size(); ++i) {
mySumMap[i] = myMap[i] * cntOcc[i].second;
}
cout << "Mapping giữa dãy ban đầu và tổng các lặp" << "\n";
for (int i = 0; i < mySumMap.size(); ++i) {
cout << "{" << i << ":" << mySumMap[i] << "}" << " ";
}
cout << "\n";
}
int main() {
runcase();
return 0;
}