using System;
using System.Collections.Generic;
namespace DS2012prac3
{
class R_Quicksort
{
static void Main(string[] args)
{
try
{
R_Quicksort QS = new R_Quicksort();
int InputAmount = int.Parse(Console.ReadLine());
NumberPair[] Numbers = new NumberPair[InputAmount];
string[] test;
for (int x = 0; x < InputAmount; x++)
{
test = Console.ReadLine().Split(' ');
Numbers[x] = new NumberPair(int.Parse(test[0]), int.Parse(test[1]));
}
QS.RandomizedQuicksort(Numbers, 0, Numbers.Length - 1);
for (int y = 0; y < Numbers.Length; y++)
Console.WriteLine(Numbers[y].FirstNumber + " " + Numbers[y].SecondNumber);// + "<" + Numbers[y].Pair + " >" );
}
catch (Exception e)
{
Console.WriteLine("error: " + e);
}
Console.ReadLine();
}
//---------------------------------------------------------------------------\\
public void RandomizedQuicksort(NumberPair[] Numbers, int p, int r)
{
if (p < r)
{
if (r - p < 20)
InsertionSort(Numbers, p, r);
else
{
int q = RandomizedPartition(Numbers, p, r);
RandomizedQuicksort(Numbers, p, q - 1);
RandomizedQuicksort(Numbers, q + 1, r);
}
}
}
public int RandomizedPartition(NumberPair[] Numbers, int p, int r)
{
Random random = new Random();
int i = random.Next(p, r);
Switchems(Numbers, i, r);
return Partition(Numbers, p, r);
}
public int Partition(NumberPair[] Numbers, int p, int r)
{
NumberPair x = Numbers[r];
int i = p - 1;
for (int j = p; j < r; j++)
{
if (Numbers[j].Pair < x.Pair)
{
i = i + 1;
Switchems(Numbers, i, j);
}
else if (Numbers[j].Pair == x.Pair)
if (Numbers[j].FirstNumber < x.FirstNumber)
{
i = i + 1;
Switchems(Numbers, i, j);
}
}
Switchems(Numbers, i + 1, r);
return i + 1;
}
//---------------------------------------------------------------------------\\
public NumberPair[] Switchems(NumberPair[] Numbers, int i, int r)
{
NumberPair holdr = Numbers[r];
Numbers[r] = Numbers[i];
Numbers[i] = holdr;
return Numbers;
}
//---------------------------------------------------------------------------\\
public void InsertionSort(NumberPair[] Numbers, int bottom, int top)
{
for (int j = bottom + 1; j <= top; j++)
{
NumberPair key = Numbers[j];
int i = j - 1;
while (i >= bottom && key.Pair <= Numbers[i].Pair)
{
if (key.Pair == Numbers[i].Pair)
{
if (key.FirstNumber < Numbers[i].FirstNumber)
Numbers[i + 1] = Numbers[i];
else break;
}
else
Numbers[i + 1] = Numbers[i];
i--;
}
Numbers[i + 1] = key;
}
}
}
//---------------------------------------------------------------------------\\
class NumberPair
{
public int FirstNumber;
public int SecondNumber;
private double pair;
public NumberPair(int first, int second)
{
this.FirstNumber = first;
this.SecondNumber = second;
this.pair = (double)FirstNumber / (double)SecondNumber;
}
public double Pair
{
get { return this.pair; }
}
}
}