import qualified Data.Map as M import Data.List import Control.Monad japari h w (ps,rs) = (n, (ps,rs)) where n = jmap !? (h-1,w-1) jmap = makeMap h w (map fst rs) comb :: Int -> [a] -> [[a]] comb 0 _ = [[]] comb _ [] = [] comb n (x:xs) = [x:y | y <- comb (n-1) xs] ++ comb n xs main = do [w,h,k,p] <- map read . words <$> getLine friends <- map (readFriends . words) <$> replicateM k getLine let pass = comb p friends let rest = map (friends \\) pass let combs = zip pass rest let (nmax,(ps,_)) = maximum (map (japari (h+1) (w+1)) combs) print (mod nmax modulo) if nmax == 0 then return () else mapM_ (putStrLn . snd) ps readFriends [x,y,n] = ((read y, read x), n) modulo = 10^9+7 (!?) im (i,j) | i<0 || j<0 = 0 | otherwise = im M.! (i,j) makeMap h w fs = foldl' (asum fs) M.empty [(i,j) | i<-[0..h-1], j<-[0..w-1]] asum fs acc pos@(i,j) | pos == (0,0) = M.insert pos 1 acc | elem pos fs = M.insert pos 0 acc | otherwise = M.insert pos (acc!?(i-1,j) + acc!?(i,j-1)) acc