Problem:
ウォーキング

会津リバーサイドホスピタルでは、リハビリと健康増進のため、入院患者が一日二回のウォーキングを行っています。元気に退院するために、ウォーキングで体力を回復しようと頑張る人が日に日に増えきたことから、院長が「一日で一番長い距離を歩いた人にプレゼントをあげよう!」という企画を立ち上げました。

患者の数 n (1 ≤ n ≤ 10000)、それぞれの患者の番号 pi (1 ≤ pi ≤ 10000)、一回目に歩いた距離 d1i、二回目に歩いた距離 d2i (0 ≤ d1i, d2i ≤ 5000) を入力とし、歩いた距離の合計が最も長い患者の番号とその距離を出力するプログラムを作成してください。ただし、一日に歩いた距離が同じ患者はいないものとします。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
p1 d11 d21
p2 d12 d22
:
pn d1n d2n

入力はすべて整数で与えられます。データセットの数は50 を超えません。

Output

入力データセットごとに、最も長い合計距離を歩いた患者の番号とその歩いた距離を１行に出力します。

Sample Input

5
263 2345 2504
1 3210 1985
5000 1501 4132
10000 503 3107
51 1758 2690
3
345 5000 2396
7 3910 1590
6789 2525 3616
0

Output for the Sample Input

5000 5633
345 7396

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _0217
{
    public class Program

    {
        public static void Main(string[] args)
        {
            while (true)
            {
                int n = RInt();
                if (n == 0) break;
                
                Dictionary<int,int> patients = new Dictionary<int,int>(n);
                for(int i = 0; i < n ; i++)
                {
                     int[] items = RIntAr();   
                     patients.Add(items[0],items[1] + items[2]);
                }
                
               var item = patients.OrderByDescending(x => x.Value).First();
               Console.WriteLine("{0} {1}",item.Key,item.Value);
            }

        }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RStAr(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }

}