Problem:
Score : 300 points

Problem Statement

You are given an integer sequence of length N, a_1,a_2,...,a_N.

For each 1≤i≤N, you have three choices: add 1 to a_i, subtract 1 from a_i or do nothing.

After these operations, you select an integer X and count the number of i such that a_i=X.

Maximize this count by making optimal choices.

Constraints

1≤N≤10^5

0≤a_i<10^5 (1≤i≤N)

a_i is an integer.

Input

The input is given from Standard Input in the following format:

N
a_1 a_2 .. a_N

Output

Print the maximum possible number of i such that a_i=X.

Sample Input 1

7
3 1 4 1 5 9 2

Sample Output 1

4

For example, turn the sequence into 2,2,3,2,6,9,2 and select X=2 to obtain 4, the maximum possible count.

Sample Input 2

10
0 1 2 3 4 5 6 7 8 9

Sample Output 2

3

Sample Input 3

1
99999

Sample Output 3

1

Solution in Haskell (GHC 7.10.3) (judge verdict: Runtime Error)

{-# LANGUAGE ScopedTypeVariables #-}
-- extension section
{-# OPTIONS_GHC -O2 -funbox-strict-fields #-}
{-# LANGUAGE BangPatterns      #-}
{-# LANGUAGE CPP               #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections     #-}
-- not supported extension
--{-# LANGUAGE Strict, StrictData #-}


module Main where

-- @@@@@@@@@@@@@@@@@--
-- import section   --
-- @@@@@@@@@@@@@@@@@--
--    import A.B.C( function name )  ...
-- or import A.B.C 

--
import           Prelude hiding(
  getLine,
  getContents,
  lines,
  words
  )

-- standard library
import           Control.Monad.ST
import           Control.Applicative
import           Data.Char
import           Data.Ratio


-- bytestring
import qualified Data.ByteString.Char8       as B
import qualified Data.ByteString.Unsafe      as B


-- containers
import           Data.Set

-- deepseq


-- regex-posix


-- text
import           Data.Text.Lazy.IO as TIO
import           Data.Text.Lazy as T
import           Data.Text.Lazy.Read as TR

-- import Data.Text.IO as TIO
-- import Data.Text as T
-- import Data.Text.Read as TR



-- unordered-containers


-- vectors
import qualified Data.Vector as V
import           Data.Vector.Unboxed as UV
import           Data.Vector.Unboxed.Mutable as MV


-- mtl


-- @@@@@@@@@@@@@@@@@--
-- main section     --
-- @@@@@@@@@@@@@@@@@--

main :: IO ()
main = do
  input <- getInput
  Prelude.putStr . show . getAnswer $ input 

-- main :: IO()
-- main = do
--   answer <- getInputandanser
--   putStr . show $ answer


-- @@@@@@@@@@@@@@@@@@@@@--
-- I/O DataType section --
-- @@@@@@@@@@@@@@@@@@@@@--
data Input = I (Int, V.Vector (Int, Int) )
  deriving(Show)

type Answer = Int


-- @@@@@@@@@@@@@@@@@--
-- answerSection    --
-- @@@@@@@@@@@@@@@@@--
getInput :: IO Input
getInput = do
  n <- (UV.!0) <$> intVectorFromLine 1 
  input <- generatePairVectorFromLine n
  return $ I (n , V.convert input)

getAnswer :: Input -> Answer 
getAnswer (I (n, v)) | V.length v == 1 = 0
                     | otherwise = case  (m' 2^n  )- (m' $ 1 + n + res  ) of 
                         res' -> if res' < 0 then res' + 998244353
                                 else res'                         
  where res =  go 0 1 0 Data.Set.empty
        go !i1 !i2 !accum' !lset 
          | i1 == n-2 && i2 == n-1 = ( m' (accum'+ dScore)) 
          | i2 == n-1 = go (i1+1) (i1+2) ( m' (accum'+ dScore))  ( ins l )
          | otherwise = go i1 (i2+1) ( m' (accum'+ dScore))  (ins l)
          where l = lineFromPoint n1 n2 
                dScore | l `member` lset = 0
                       | otherwise = 2^k - k - 1
                (k:: Int) = case l of
                  L (_,_) -> (1+). V.length .V.filter  ( == True) $ V.map ( (l==) . (lineFromPoint n2)) ( v :: V.Vector (Int,Int) )  
                  L0 _ -> V.length .V.filter  ( == True) $ V.map ( (l==) . (lineFromPoint n2)) ( v :: V.Vector (Int,Int) )  
                n1 = v V.! i1
                n2 = v V.! i2
                ins = flip insert lset

getInputAndAnser :: IO Answer
getInputAndAnser = undefined


-- @@@@@@@@@@@@@@@@@@@@@@@@@@--
-- question unique section    --
-- @@@@@@@@@@@@@@@@@@@@@@@@@@--

data Line = L (Ratio Int, Ratio Int) | L0 Int
  deriving(Show, Eq, Ord)

lineFromPoint :: (Int,Int) -> (Int,Int) -> Line
lineFromPoint (x0,y0) (x1,y1)
  | x0 /= x1 =
      L ( (y1-y0) % (x1-x0) , ( (x1-x0)*y0 - (y1-y0)*x0) % (x1-x0) )
  | otherwise = L0 x0

m' :: Int -> Int 
m' i = i `mod`998244353

-- @@@@@@@@@@@@@@@@@--
-- util section     --
-- @@@@@@@@@@@@@@@@@--

-- standard Input Function
gLine :: IO Text
gLine = getLine

gContents :: IO Text
gContents = getContents

-- intVectorFromline 5  ("1 2 3 4 5") -> vector <1,2,3,4,5> 
intVectorFromLine ::Int -> IO ( Vector Int )
intVectorFromLine n = UV.unfoldrN n (B.readInt.B.dropWhile isSpace) <$> B.getLine

pairFromLine :: IO (Int,Int)
pairFromLine = do
  v <- intVectorFromLine 2
  return ( v ! 0, v ! 1)

generatePairVectorFromLine :: Int -> IO ( Vector (Int, Int) )
generatePairVectorFromLine n = generateM n (const pairFromLine)