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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    ll n;
    vector<ll> odd, even;

    cin >> n;
    for(int i = 0; i < n; i++){
        int x;
        cin >> x;
        if(x % 2 == 0) even.push_back(x);
        else odd.push_back(x);
    }


    int el = even.size(), ol = odd.size();
    ll ans;

    if(el == n && n == 2){
        ans = max(even[0], even[1]);
    }
    else if(ol == n && n == 2){
        ans = max(odd[0], odd[1]);
    }
    else if(n == 2){
        ans = max(odd[0], even[0]);
    }
    else if(el == n){
        ans = even[0];
        for(int i = 1; i < n; i++)
             ans = __gcd(ans, even[i]);
    }
    else if(ol == n){
        ans = odd[0];
        int cnt = 0;
        ll pre = ans;
        for(int i = 1; i < n; i++){
            ans = __gcd(ans, odd[i]);
            if(ans == 1){
                cnt++;
                if(cnt <= 1) ans = pre;
            }
            pre = ans;
        }
    }
    else if(el == 1){
        ans = odd[0];
        for(int i = 1; i < ol; i++){
            ans = __gcd(ans, odd[i]);
        }
    }
    else if(ol == 1){
        ans = even[0];
        ll pre = ans;
        int cnt = 0;
        for(int i = 1; i < el; i++){
            ans = __gcd(ans, even[i]);
            if(ans == 1){
                cnt++;
                if(cnt <= 1){
                    ans = pre;
                }
            }
            pre = ans;
        }
    }
    else{
        ans = 1;
    }

    cout << ans << endl;

    return 0;
}