import Data.Array.IArray
import Data.List
import Text.Printf
import Data.Array.Diff
import System.Environment(getArgs)

n :: Int
n = 30

-- a :: Array (Int,Int) Int
a :: DiffArray (Int,Int) Int
-- a :: DiffUArray (Int,Int) Int
a = array ((0,0),(n,n)) [((i,j),1)| i<-[0..n],j<-[0..n]]

display a = putStrLn $ unlines $ [concatMap (printf "%3d") [a!(i,j) | j<-[0..n]] | i<-[0..n]]

-- loop over per-element updates
loop 0 a = a
loop c a = loop (c-1) $ foldl' process a (indices a)
  where process a (i,j) 
          | i>0&&j>0&&i<n&&j<n = let aij = (a!(i-1,j)+a!(i+1,j)+a!(i,j-1)+a!(i,j+1))`mod`100
                                 in aij `seq` a//[((i,j),aij)]
          | otherwise          = a

-- loop over whole-array bulk updates
loop2 0 a = a
loop2 c a = loop2 (c-1) $ array (bounds a) (process a (indices a))
  where process a [] = []
        process a ((i,j):ijs) 
          = let aij | i>0&&j>0&&i<n&&j<n = (a!(i-1,j)+a!(i+1,j)+a!(i,j-1)+a!(i,j+1))`mod`100
                    | otherwise          = a!(i,j)
            in aij `seq` ((((i,j),aij):) $! process a ijs)

test c = display $ loop c a

test2 c = display $ loop2 c a

main = do
  (c:_) <- getArgs
  test (read c)
