Problem:
Score : 300 points

Problem Statement

There are N integers, A_1, A_2, ..., A_N, written on the blackboard.

You will choose one of them and replace it with an integer of your choice between 1 and 10^9 (inclusive), possibly the same as the integer originally written.

Find the maximum possible greatest common divisor of the N integers on the blackboard after your move.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

Output

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum possible greatest common divisor of the N integers on the blackboard after your move.

Sample Input 1

3
7 6 8

Sample Output 1

2

If we replace 7 with 4, the greatest common divisor of the three integers on the blackboard will be 2, which is the maximum possible value.

Sample Input 2

3
12 15 18

Sample Output 2

6

Sample Input 3

2
1000000000 1000000000

Sample Output 3

1000000000

We can replace an integer with itself.

Solution in Scala (2.11.7) (judge verdict: Wrong Answer)

object Main extends App {
  val n = scala.io.StdIn.readInt()
  var aInput = scala.io.StdIn.readLine()
  val aArray =  aInput.split(" ").map(_.toInt).toVector
  var max = 0
  def getGcd(aInput: Int, bInput: Int): Int = {
    var tmp = 0
    var aInit = 0
    var bInit = 0
    if(aInput > bInput) {
      aInit = bInput
      bInit = aInput
    } else {
      aInit = aInput
      bInit = bInput
    }
    var a = aInit
    var b = bInit
    // println(s"------------${aInput}:${bInput}----------------")
    while ( {
      tmp = a % b
      // println(tmp)
      tmp != 0
    }) {
      a = b
      b = tmp
    }
    if(b == bInit) {
      1
    } else {
      b
    }
  }
  if(n == 2) {
    max = if (aArray(0) > aArray(1)) aArray(0) else aArray(1)
  } else {
    val lastIndex = aArray.length - 1
    // 最初を起点にした最大公約数リスト
    val list1 = aArray.tail.map(a => getGcd(aArray(0), a)).sorted
    // 最後を起点とした最大公約数リスト
    val list2 = aArray.init.map(a => getGcd(aArray(lastIndex), a)).sorted
    // println(list1)
    // println(list2)
    // 最小から二つ目の大きい方
    var maxList = Vector.empty[Int]
    if (list1(1) > list2(1)) {
      maxList = list1.tail
    } else {
      maxList = list2.tail
    }
    if(maxList.length > 1) {
      max = getGcd(maxList(0), maxList(1))
    } else {
      max = maxList(0)
    }

  }
  print(max)
}