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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[100005],b[100005];
int fun(int x)
{
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
            return 0;
    }
    return 1;
}
void px(int x,int y)
{
    if(x>=y) return;
    int mid=(x+y)/2;
    px(x,mid);
    px(mid+1,y);
    int z=x,k=mid+1,ans=0;
    while(z<=mid&&k<=y)
    {
        if(a[z]<=a[k])
        b[ans++]=a[z++];
        else
            b[ans++]=a[k++];
    }
    for(int i=z;i<=mid;i++)
        b[ans++]=a[i];
    for(int i=k;i<=y;i++)
        b[ans++]=a[i];
    for(int i=x,j=0;i<=y;i++)
        a[i]=b[j++];
}
int main()
{
    int n,ans=0;
    scanf("%d",&n);
    int vp[n];
    for(int i=0;i<n;i++)
        scanf("%d",&vp[i]);
    if(n==2)
        goto end;

    if(fun(vp[0])==1)
    {
        int m=vp[0];
        vp[0]=vp[2];
        vp[2]=m;
    }
    if(fun(vp[1])==1)
    {
        int m=vp[1];
        vp[1]=vp[2];
        vp[2]=m;
    }
    int x=vp[0],y=vp[1];
    while(x%y)
        {
            int z=y;
            y=x%y;
            x=z;
        }
        a[ans++]=y;
    for(int i=2;i<n;i++)
    {
        x=y;
        y=vp[i];
        if(x<y)
        {
            int z=x;
            x=y;
            y=z;
        }
        while(x%y)
        {
            int z=y;
            y=x%y;
            x=z;
        }

        a[ans++]=y;

    }
    px(0,n-2);
   end: if(n==2)
    {
        vp[0]=vp[0]<vp[1]?vp[1]:vp[0];
        printf("%d",vp[0]);
    }
       else
        printf("%d",a[1]);



}