-- Try yukicoder -- author: Leonardone @ NEETSDKASU import Data.Char (digitToInt) import Data.Word (Word64) import Data.Bits main = interact $ unlines . map format . solve . parse . lines parse (nkstr:lsstr:tbstr) = ret where [n, k] = map read $ words nkstr ls = map read $ words lsstr tb = zip [1..] $ map mf tbstr :: [(Int, Word64)] ret = (n, k, ls, tb) mf = fromInteger . foldl f 0 f a b = shiftL a 1 .|. (toInteger $ digitToInt b) format (l, (y, x)) = unwords $ map show [y, x, y, x + l - 1] solve (n, k, ls, tb) = zip ls $ reverse ans where (ans, _) = foldl (fix n) ([], tb) ls fullbits n = shiftL 1 n - 1 setbits t x s = t `xor` shiftL x s getbits x (s, t) = shiftR t s .&. x find n l t = ret where fb = fullbits l mf1 s = (s, setbits t fb s) mf2 nb = (popCount . getbits fb $ snd nb, nb) bs = map mf1 [0..n-l] nbs = zip [n-l+1-i | i <- [0..]] bs ret = foldl1 f $ map mf2 nbs f a b = if fst a < fst b then a else b get tb n l = ret where ret = foldl1 f $ map mf tb mf (y, t) = (y, find n l t) f a b = if fst (snd a) < fst (snd b) then a else b fix n (r, tb) l = ret where (y, (_, (x, (_, b)))) = get tb n l ret = ((y, x):r, swap b (y-1) tb) swap u 0 ((i, _):es) = (i, u) : es swap u p (e:es) = e : swap u (p-1) es