Problem:
陸上競技大会

陸上競技大会 200M の準決勝 3 組のレースが行われました。それぞれの組に 8 名（計 24 名）の選手が出場します。各組上位 2 位までの選手と、各組の 3 位以下の全選手の中から上位 2 名の計 8 名が決勝に進出します。

選手番号とタイムを入力とし、決勝進出者 8 名の番号とそのタイムを出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

p1 t1
p2 t2
:
p24 t24

1 行目から 8 行目に１組目の選手番号 pi (整数、1 ≤ pi ≤ 10000) とタイム ti (1/100 まで計測した実数、1 ≤ ti ≤ 100)、9 行目から 16 行目に２組目の選手番号 pi とタイム ti、17 行目から 24 行目に３組目の選手番号 pi とタイム ti が与えられます。同じ選手番号の選手、同タイムの選手はいないものとします。

Output

以下の順番で、決勝進出者の選手番号とタイムを空白区切りでそれぞれ１行に出力してください。

1 組目の 1 位の選手

1 組目の 2 位の選手

2 組目の 1 位の選手

2 組目の 2 位の選手

3 組目の 1 位の選手

3 組目の 2 位の選手

各組で 3 位以下の選手の中でタイムが 1 位の選手

各組で 3 位以下の選手の中でタイムが 2 位の選手

Sample Input

18 25.46
16 26.23
3 23.00
10 24.79
5 22.88
11 23.87
19 23.90
1 25.11
23 23.88
4 23.46
7 24.12
12 22.91
13 21.99
14 22.86
21 23.12
9 24.09
17 22.51
22 23.49
6 23.02
20 22.23
24 21.89
15 24.14
8 23.77
2 23.42

Output for the Sample Input

5 22.88
3 23.00
13 21.99
14 22.86
24 21.89
20 22.23
17 22.51
12 22.91

Solution in C# (judge verdict: Accepted)

using System;

namespace AOJ.Volume1
{
    public class TrackAndFieldCompetition
    {
        public static int Main()
        {
            // 各レース3位の中での上位2名
            int no_1 = 0, no_2 = 0;
            double tm_1 = double.MaxValue, tm_2 = double.MaxValue;

            for (int r = 0; r < 3; r++)
            {
                // レース内での1位?3位
                int f_no = 0, s_no = 0, t_no = 0;
                double f_tm = double.MaxValue;
                double s_tm = double.MaxValue;
                double t_tm = double.MaxValue;
                for (int n = 0; n < 8; n++)
                {
                    var input = Console.ReadLine().Split(' ');
                    int tmp_no = int.Parse(input[0]);
                    double tmp_time = double.Parse(input[1]);
                    // 入力と3位の比較
                    if (tmp_time < t_tm)
                    {
                        t_no = tmp_no;
                        t_tm = tmp_time;
                    }
                    // 3位と2位を比較
                    if (t_tm < s_tm)
                    {
                        // 入れ替え
                        tmp_no = s_no;
                        tmp_time = s_tm;
                        s_no = t_no;
                        s_tm = t_tm;
                        t_no = tmp_no;
                        t_tm = tmp_time;
                    }
                    // 2位と1位を比較
                    if (s_tm < f_tm)
                    {
                        tmp_no = f_no;
                        tmp_time = f_tm;
                        f_no = s_no;
                        f_tm = s_tm;
                        s_no = tmp_no;
                        s_tm = tmp_time;
                    }
                }
                // 1位と2位を出力
                Console.WriteLine(string.Format("{0} {1:N2}", f_no, f_tm));
                Console.WriteLine(string.Format("{0} {1:N2}", s_no, s_tm));
                // 3位同士の比較
                if (t_tm < tm_2)
                {
                    no_2 = t_no;
                    tm_2 = t_tm;
                }
                if (tm_2 < tm_1)
                {
                    int tmp_no = no_1;
                    double tmp_tm = tm_1;
                    no_1 = no_2;
                    tm_1 = tm_2;
                    no_2 = tmp_no;
                    tm_2 = tmp_tm;
                }
            }
            // 3位の出力
            Console.WriteLine(string.Format("{0} {1:N2}", no_1, tm_1));
            Console.WriteLine(string.Format("{0} {1:N2}", no_2, tm_2));

            return 0;
        }
    }
}