import qualified Data.Vector         as V
import qualified Data.Vector.Mutable as VM
import Control.Applicative
import Control.Monad.ST
import Control.Monad
import Data.STRef

bubbleSort :: [Int] -> ([Int], Int)
bubbleSort xs = runST $ do
  aVec <- V.thaw $ V.fromList xs
  c <- newSTRef 0
  loop aVec c
  list  <- V.toList <$> V.freeze aVec
  count <- readSTRef c
  return (list, count)
    where
      len = length xs - 1
      loop aVec c = do
        flag <- newSTRef False
        forM_ [len, len - 1 .. 1] $ \j -> do
          v1 <- VM.read aVec j
          v2 <- VM.read aVec (j - 1)
          when (v1 < v2) $ do
            VM.swap aVec j (j - 1)
            writeSTRef flag True
            modifySTRef c (+ 1)
        f <- readSTRef flag
        when f $ loop aVec c

main :: IO ()
main = do
  _  <- getLine
  xs <- map read . words <$> getLine
  let (ys, c) = bubbleSort xs
  putStrLn $ unwords $ map show ys
  print c

