{-
G - Longest Path

問題文

N頂点 M 辺の有向グラフ G があります。頂点には 1,2,…,N と番号が振られています。
各 i (1≤i≤M) について、i 番目の有向辺は頂点 xi から yi へ張られています。
Gは有向閉路を含みません。

Gの有向パスのうち、最長のものの長さを求めてください。
ただし、有向パスの長さとは、有向パスに含まれる辺の本数のことです。

制約
    入力はすべて整数である。
    2≤ N≤ 10^5
    1≤ M ≤10^5
    1 ≤ xi,yi ≤ N
    ペア (xi,yi)はすべて相異なる。
    Gは有向閉路を含まない。

入力
入力は以下の形式で標準入力から与えられる。

N M
x1 y1
x2 y2
:
xM yM

出力

Gの有向パスのうち、最長のものの長さを出力せよ
-}
{-# LANGUAGE BangPatterns #-}

import Control.Monad.Trans.State.Lazy
import qualified Data.ByteString.Char8 as B
import Control.Monad
import Data.List
import Data.Maybe
import qualified Data.Vector as V

rint :: StateT B.ByteString Maybe Int
rint = StateT $ B.readInt.B.dropWhile(<'!')
rint2 = (,) <$> ((+(-1))<$>rint) <*> ((+(-1))<$>rint)
rvn ps n = V.replicateM n ps

parse = do
    n <- rint
    m <- rint
    xs <- rvn rint2 m
    return (n,xs)

main=print.f =<< fromJust.evalStateT parse <$> B.getContents

f :: (Int, V.Vector (Int,Int)) -> Int
f (n,xs) = V.maximum v
    where
        cods = V.accumulate  (flip (:))  (V.replicate n []) xs
        v = V.generate n m
        m i = (+1) $ maximum $ ((-1):) $ map (\j->v V.! j) $ cods V.! i