from fractions import gcd



class SegTree:

    def __init__(self, N, A, f, e):

        """

        N: A の要素数

        A: セグ木に乗せたい配列

        f: 二項演算 (モノイドじゃなきゃだめ)

        e: f の単位元

        """

        n = 2**(N-1).bit_length() # セグ木の葉の数（N 以上の最小の2べき）

        c = [e] * (2*n)



        for i in range(N):

            c[i+n] = A[i] # 葉をA[i]の値にする

        

        for i in range(n-1, 0, -1):

            c[i] = f(c[i<<1|0], c[i<<1|1]) # 子を使ってボトムアップに値を更新していく

        

        self.n = n # セグ木の葉の数（N 以上の最小の2べき）

        self.c = c # セグ木の配列

        self.e = e

        self.f = f

    

    def update(self, k, x):

        k += self.n

        self.c[k] = x # 対応する葉に移動



        # 祖先をたどって更新していく

        while k > 1:

            k >>= 1

            self.c[k] = self.f(self.c[k<<1|0], self.c[k<<1|1])



    def query(self, l, r):

        res = self.e

        l += self.n; r += self.n # 対応する葉に移動



        while l < r: # 範囲がかぶらない間

            if l & 1: # 左端が右側にいるなら

                res = self.f(res, self.c[l]) # その値と res の積をとって

                l += 1 # 右に 1 動く



            if r & 1: # 右端が左側にいるなら

                r -= 1 # 左に 1 動いて (右端は閉なので)

                res = self.f(res, self.c[r]) # その値と res の積をとる



            l >>= 1; r >>= 1 # 親に移動

        

        return res



N = int(eval(input()))

A = [int(i) for i in input().split()]



seg = SegTree(N, A, gcd, 0)



res = 0

for i in range(N):

    res = max(res, gcd(seg.query(0, i), seg.query(i+1, N)))



print(res)
from fractions import gcd



N = int(eval(input()))

A = [int(i) for i in input().split()]



cuml = [0]

cumr = [0]



for i in range(N):

    cuml.append(gcd(cuml[i], A[i]))

    cumr.append(gcd(cumr[i], A[N-i-1]))





maxg = 0

for i in range(N):

    # print(gcd(cuml[i], cumr[N-i-1]))

    maxg = max(maxg, gcd(cuml[i], cumr[N-i-1]))

print(maxg)
from fractions import gcd


class SegTree:
    def __init__(self, N, A, f, e):
        """
        N: A の要素数
        A: セグ木に乗せたい配列
        f: 二項演算 (モノイドじゃなきゃだめ)
        e: f の単位元
        """
        n = 2 ** (N - 1).bit_length()  # セグ木の葉の数（N 以上の最小の2べき）
        c = [e] * (2 * n)
        for i in range(N):
            c[i + n] = A[i]  # 葉をA[i]の値にする
        for i in range(n - 1, 0, -1):
            c[i] = f(c[i << 1 | 0], c[i << 1 | 1])  # 子を使ってボトムアップに値を更新していく
        self.n = n  # セグ木の葉の数（N 以上の最小の2べき）
        self.c = c  # セグ木の配列
        self.e = e
        self.f = f

    def update(self, k, x):
        k += self.n
        self.c[k] = x  # 対応する葉に移動
        # 祖先をたどって更新していく
        while k > 1:
            k >>= 1
            self.c[k] = self.f(self.c[k << 1 | 0], self.c[k << 1 | 1])

    def query(self, l, r):
        res = self.e
        l += self.n
        r += self.n  # 対応する葉に移動
        while l < r:  # 範囲がかぶらない間
            if l & 1:  # 左端が右側にいるなら
                res = self.f(res, self.c[l])  # その値と res の積をとって
                l += 1  # 右に 1 動く
            if r & 1:  # 右端が左側にいるなら
                r -= 1  # 左に 1 動いて (右端は閉なので)
                res = self.f(res, self.c[r])  # その値と res の積をとる
            l >>= 1
            r >>= 1  # 親に移動
        return res


N = int(eval(input()))
A = [int(i) for i in input().split()]
seg = SegTree(N, A, gcd, 0)
res = 0
for i in range(N):
    res = max(res, gcd(seg.query(0, i), seg.query(i + 1, N)))
print(res)

from fractions import gcd

N = int(eval(input()))
A = [int(i) for i in input().split()]
cuml = [0]
cumr = [0]
for i in range(N):
    cuml.append(gcd(cuml[i], A[i]))
    cumr.append(gcd(cumr[i], A[N - i - 1]))
maxg = 0
for i in range(N):
    # print(gcd(cuml[i], cumr[N-i-1]))
    maxg = max(maxg, gcd(cuml[i], cumr[N - i - 1]))
print(maxg)

- - -class SegTree: -    def __init__(self, N, A, f, e): -        """ -        N: A の要素数 -        A: セグ木に乗せたい配列 -        f: 二項演算 (モノイドじゃなきゃだめ) -        e: f の単位元 -        """ -        n = 2 ** (N - 1).bit_length()  # セグ木の葉の数（N 以上の最小の2べき） -        c = [e] * (2 * n) -        for i in range(N): -            c[i + n] = A[i]  # 葉をA[i]の値にする -        for i in range(n - 1, 0, -1): -            c[i] = f(c[i << 1 | 0], c[i << 1 | 1])  # 子を使ってボトムアップに値を更新していく -        self.n = n  # セグ木の葉の数（N 以上の最小の2べき） -        self.c = c  # セグ木の配列 -        self.e = e -        self.f = f - -    def update(self, k, x): -        k += self.n -        self.c[k] = x  # 対応する葉に移動 -        # 祖先をたどって更新していく -        while k > 1: -            k >>= 1 -            self.c[k] = self.f(self.c[k << 1 | 0], self.c[k << 1 | 1]) - -    def query(self, l, r): -        res = self.e -        l += self.n -        r += self.n  # 対応する葉に移動 -        while l < r:  # 範囲がかぶらない間 -            if l & 1:  # 左端が右側にいるなら -                res = self.f(res, self.c[l])  # その値と res の積をとって -                l += 1  # 右に 1 動く -            if r & 1:  # 右端が左側にいるなら -                r -= 1  # 左に 1 動いて (右端は閉なので) -                res = self.f(res, self.c[r])  # その値と res の積をとる -            l >>= 1 -            r >>= 1  # 親に移動 -        return res - -seg = SegTree(N, A, gcd, 0) -res = 0 +cuml = [0] +cumr = [0] -    res = max(res, gcd(seg.query(0, i), seg.query(i + 1, N))) -print(res) +    cuml.append(gcd(cuml[i], A[i])) +    cumr.append(gcd(cumr[i], A[N - i - 1])) +maxg = 0 +for i in range(N): +    # print(gcd(cuml[i], cumr[N-i-1])) +    maxg = max(maxg, gcd(cuml[i], cumr[N - i - 1])) +print(maxg)