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 C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll allg[1000000];

ll gcd(ll a, ll b){
    while(b != 0){
        ll tmp = b;
        b = a % b;
        a = tmp;
    }
    return a;
}

void allg_setter(vector<ll> &array,int n){
    allg[0] = array.at(0);
    //cout << allg[0] << " ";
    for(int i=1;i<n;i++){
        allg[i] = gcd(allg[i-1],array.at(i));
        //cout << allg[i] << " ";
    }
    //cout << endl;
}

ll maxg(vector<ll> &array,int n){
    if(n == 2){
        return max(gcd(array.at(0),array.at(1)),max(gcd(array.at(1),array.at(2)),gcd(array.at(0),array.at(2))));
    }
    ll g1 = gcd(maxg(array,n-1),array.at(n));
    //cout << g1 << " " << allg[n-1] << endl;
    return max(g1,allg[n-1]);
}


int main(){
    int n;
    cin >> n;
    vector<ll> array(n);
    for(int i=0;i<n;i++) cin >> array.at(i);
    
    allg_setter(array,n);
    if(n == 2){
        cout <<  max(array.at(0),array.at(1)) << endl;
    }
    cout << maxg(array,n-1) << endl;
    /*for(int i=0;i<n;i++){
        cout << allg[i] << " ";
    }*/
}