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 Haskell (judge verdict: Accepted)

import Control.Monad

main :: IO ()
main = do
  n <- readLn
  if n == 0
    then return ()
    else do
      ls <- replicateM n getLine
      let ls' = map (map read . words) ls
      putStrLn (solve ls')
      main

solve :: [[Int]] -> String
solve ls = toStr (foldl1 comp (map toTuple ls))
  where
    toStr :: (Int,Int) -> String
    toStr (a,b) = (show a) ++ " " ++ (show b)

    comp :: (Int,Int) -> (Int,Int) -> (Int,Int)
    comp (a1,b1) (a2,b2)
      | b1 < b2 = (a2,b2)
      | otherwise = (a1,b1)
      
    toTuple :: [Int] -> (Int,Int)
    toTuple [p,d1,d2] = (p,d1+d2)