Problem:
危ない橋

会津若松市よりずっと北に位置する会津古松村では、「ヤ橋(やばし) 」と呼ばれる橋が周辺の村へ移動する唯一の手段となっています。その橋は通行人が多いにも関わらず、今にも壊れそうなほど老朽化が進んでしまっています。

ヤ橋は 150 [kg] まで耐えられる強度を持っています。例えば、80 [kg] の人と 50 [kg] の人が同時に渡ることはできますが、80 [kg] の人が渡っているときに 90 [kg] の人が渡り始めると、ヤ橋は壊れてしまいます。

もしヤ橋が壊れてしまったら、会津古松村の人々は周辺の村へ移動する手段を失ってしまいます。そこで、村で唯一のプログラマーであるあなたは、村民の生活を守るために、橋の渡り方から橋が壊れるか否かを判定するプログラムを作成することにしました。

橋を渡る通行人の人数 n (1 ≤ n ≤ 100)、各通行人の体重 mi (1 ≤ mi ≤ 100)、橋を渡り始める時刻 ai、渡り終える時刻 bi (0 ≤ ai, bi < 231) を入力とし、橋が壊れない場合は“OK ”と出力し、壊れる場合は“NG ”と出力するプログラムを作成してください。なお、橋の上にいる通行人の体重の総和が 150 [kg] を超えてしまうとヤ橋は壊れてしまいます。また、ai の時点で通行人は橋の上にいますが、bi の時点では橋の上にいません。

Input

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

n
m1 a1 b1
m2 a2 b2
:
mn an bn

データセットの数は 1200 を超えません。

Output

入力データセットごとに、橋が壊れるか否かを1行に出力します。

Sample Input

3
80 0 30
50 5 25
90 27 50
3
80 0 30
70 5 25
71 30 50
0

Output for the Sample Input

NG
OK

Solution in Haskell (judge verdict: Accepted)

import Control.Applicative
import Control.Monad
import Control.Monad.ST
import qualified Data.ByteString as BS
import Data.Functor
import Data.Function
import Data.Monoid
import Data.Maybe
import Data.List
import qualified Data.Foldable as Foldable
import qualified Data.Set as Set
--import qualified Data.Sequence as Sequence
import Data.List.Split
import Data.Bits
import Data.Char
import Data.Ix
import Data.Ratio
import Data.Ord
import Data.Tuple
import Data.Array
--import Data.Array.Unboxed
--import Data.Array.IArray
import Data.Array.MArray
import Data.Array.IO
import Data.Array.ST
import Data.IORef
import Data.STRef
import GHC.ST
-- import System.IO.Unsafe

-- templete
readInt = read :: String -> Int
readInteger = read :: String -> Integer
readDouble = read :: String -> Double
getInt = readLn :: IO Int
getInts = map readInt . words <$> getLine
getInteger = readLn :: IO Integer
getIntegers = map readInteger . words <$> getLine
getDouble = readLn :: IO Double
getDoubles = map readDouble . words <$> getLine
sjoin :: (Show a) => [a] -> String
sjoin = unwords . map show
tjoin :: (Show a, Show b) => (a, b) -> String
tjoin (x, y) = show x ++ (' ' : show y)
cond :: a -> a -> Bool -> a
cond t f c = if c then t else f
apply2 :: (a -> a -> b) -> [a] -> b
apply2 f [x,y] = f x y
apply3 :: (a -> a -> a -> b) -> [a] -> b
apply3 f [x,y,z] = f x y z
apply4 :: (a -> a -> a -> a -> b) -> [a] -> b
apply4 f [x,y,z,w] = f x y z w
fnTuple :: (a -> b, a -> c) -> a -> (b, c)
fnTuple (f,g) a = (f a, g a)
replace :: (Eq a) => a -> a -> [a] -> [a]
replace x y = map (\z -> if z==x then y else z)
binMap :: (a -> a -> b) -> [a] -> [b]
binMap f (x:xs@(y:_)) = f x y : binMap f xs
binMap _ _ = []
splitRec :: Int -> [a] -> [[a]]
splitRec _ [] = []
splitRec n xs = let (y,ys) = splitAt n xs in y : splitRec n ys
infixl 7 `divCeil`
divCeil :: Integral a => a -> a -> a
x `divCeil` y = (x+y-1) `div` y
coverC :: Ord a => (a, a) -> a -> Bool
coverC (l,r) x = l<=x && x<=r
coverH :: Ord a => (a, a) -> a -> Bool
coverH (l,r) x = l<=x && x<r
ibsearch :: (Int -> Bool) -> (Int,Int) -> Int
ibsearch f (ok,ng) = if abs (ok-ng) <= 1 then ok else let mid = (ok + ng) `div` 2 in ibsearch f (if f mid then (mid,ng) else (ok,mid))
-- templete

f s = fromMaybe "NG" $ "OK" <$ foldM (\x d -> mfilter (<=150) (Just $ x+d)) 0 s

main = do
    n <- getInt
    unless (n==0) $ map snd . sort . concat . map (\[m,a,b] -> [(a,m), (b,-m)]) <$> replicateM n getInts >>= putStrLn . f >> main