#include <iostream>
#include <cstring>
using namespace std;
const int MAX_SIZE = 121;
struct Elev {
double medie;
char nume[21];
};
void sortare(int n, Elev elevi[30]) {
// pun toate numele in functie de medie, incepand cu media cea mai mica
// parcurg fiecare medie
// pun cea mai mica medie pe prima pozitie, apoi numele de pe prima pozitie il voi interschimba cu
// numele de pe pozitia respectiva
int start_position = 0, final_position = 0, md = 0;
for (int element = 0; element < n; ++element) {
int min_position = element;
Elev aux[21];
// parcurg toate pozitiile
for (int i = element; i < n; ++i) {
if (elevi[min_position].medie > elevi[i].medie) {
min_position = i;
}
}
// cout << min_position;
// if (min_position != element) {
// schimb numele de pe pozitia cea mai mica cu numele de pe pozitia respectiva
strcpy(aux[0].nume, elevi[element].nume);
//cout <<"numele de pe pozitia actuala este : " << aux << "\n";
strcpy(elevi[element].nume, elevi[min_position].nume);
//cout << "numele de pe cea mai mica pozitie este : " << elevi[min_position].nume << "\n";
strcpy(elevi[min_position].nume, aux[0].nume);
// schimb media de pe pozitia cea mai mica cu media de pe pozitia respectiva
aux[1].medie = elevi[element].medie;
elevi[element].medie = elevi[min_position].medie;
elevi[min_position].medie = aux[1].medie;
// pana aici am afisat in functie de medie, numele nu sunt neaparat in ordinea care trebuie
// acum schimb numele de pe fiecare portiune in functie de nume
if (element > 0) {
if (md != elevi[element].medie) {
final_position = element;
// aranjez cuvintele de pe portiunea start_position-final_position
for (int i = start_position; i < final_position; ++i) {
int position_min = i;
for (int j = i + 1; j < final_position; ++j) {
// aflu cuvantul minim
if (strcmp(elevi[position_min].nume, elevi[j].nume) > 0) {
position_min = j;
}
}
// schimb numele de pe positia minima cu numele de pe pozitia actuala positie si invers
if (position_min != i) {
char aux[21];
strcpy(aux, elevi[i].nume);
strcpy(elevi[i].nume, elevi[position_min].nume);
strcpy(elevi[position_min].nume, aux);
}
}
start_position = final_position;
md = elevi[element].medie;
}
}
}
}
int main() {
int n;
cin >> n;
char aux[MAX_SIZE];
Elev elevi[MAX_SIZE];
for (int i = 0; i < n; ++i) {
cin >> elevi[i].medie >> elevi[i].nume;
}
sortare(n, elevi);
for (int i = 0; i < n; ++i) {
cout << elevi[i].medie << " " << elevi[i].nume << "\n";
}
return 0;
}