Buggy python submission (verdict: Time Limit Exceeded):
n=int(input())
A=list(map(int,input().split()))
inf=float("inf")
def gcd(a,b):
    if a==inf:return b
    if b==inf:return a
    if b==0: return a
    else:
        return gcd(b,a%b)
def lcm(a,b):
    return a*b//gcd(a,b)

class segtree:
    def __init__(self,n,operator,identity):
        """
        n: データ配列のサイズ
        operator: 演算子。関数。minとか。
        identity: 単位元。minだったらinf。
        """
        nb=bin(n)[2:] #2進数に変換し、最初の"0b"を除く
        bc=sum([int(digit) for digit in nb]) #これが1だったら2の累乗形
        if bc==1:
            self.num_end_leaves= 2**(len(nb)-1)
        else:
            self.num_end_leaves= 2**(len(nb))

        self.array= [identity for i in range(self.num_end_leaves *2)]
        #単位元で初期化。1個多いのは別にええやろ

        self.identity= identity
        self.operator = operator

    def update(self,x,val):
        """
        x: 代入場所
        val: 代入する値
        """
        actual_x= x+self.num_end_leaves-1
        #末端の葉数が32ならば、末端のindexは31から。

        self.array[actual_x] = val  #更新
        while actual_x>0:
            actual_x = (actual_x-1)//2 #親を見る
            self.array[actual_x]= \
            self.operator( self.array[actual_x*2+1], self.array[actual_x*2+2])

    def get(self, q_left, q_right, arr_ind=0, leaf_left=0, depth=0):
        """
        q_left: クエリ区間の左
        q_right: クエリ区間の右(閉区間)
        arr_ind: 木配列のindex. 最初は親なので0
        leaf_left: 葉がカバーしてる範囲の左端
        depth: 木配列の深さ。
        """
        
        width_of_floor = self.num_end_leaves//(2**depth)
        #今の葉のカバー幅(最初は全体(32としよう))

        leaf_right= leaf_left + width_of_floor - 1
        #今の葉のカバー幅の右端

        if (q_right < leaf_left) or (leaf_right < q_left):
            return  self.identity #クエリ領域と葉が関係ないなら単位元を返す

        elif q_left <= leaf_left and leaf_right <= q_right:
            return self.array[arr_ind] #クエリ領域に葉がすっぽり入ってるなら、葉の値を返す

        else: #そうじゃないならば、子を見る
            val_left = self.get(q_left,q_right, 2*arr_ind+1, leaf_left, depth+1)
            val_right = \
            self.get(q_left,q_right, \
            2*arr_ind+2, leaf_left+width_of_floor//2, depth+1)
            return self.operator(val_left,val_right) #子をマージする演算をする。


seg=segtree(n, gcd, float("inf"))
# A=[i for i in range(10)]
for i,num in enumerate(A):  #用意した配列をぶち込む
  seg.update(i,num)
# print(seg.array)
ans=0
for i in range(n):
    seg.update(i,inf)
    ans=max(ans, seg.array[0])
    seg.update(i,A[i])
print(ans)

Fixed submission:
n=int(input())
A=list(map(int,input().split()))
def gcd(a,b):
  if a*b==0:
    return a if b==0 else b
  else:
    while b:
      a,b=b,a%b
  return a

B=[0]*(n+5)
C=[0]*(n+5)

for i in range(n):
  B[i+1]=gcd(B[i],A[i])
  C[i+1]=gcd(C[i],A[n-i-1])
po=0
for i in range(n):
  po=max(po,gcd(B[i],C[n-1-i]))
print(po)

Buggy python submission (verdict: Runtime Error):
n=int(input())
A=list(map(int,input().split()))
def gcd(a,b):
  if a*b==0:
    return a if b==0 else b
  else:
    while b:
      a,b=b,a%b
  return a

B=[]
B[0]=0
C=[]
C[0]=0
for i in range(n-1):
  B[i+1]=gcd(B[i],A[i])
  C[i+1]=gcd(C[i],A[n-i-1])
po=0
for i in range(n):
  po=max(po,B[i]*C[n-1-i])
print(po)


Fixed submission:
n=int(input())
A=list(map(int,input().split()))
def gcd(a,b):
  if a*b==0:
    return a if b==0 else b
  else:
    while b:
      a,b=b,a%b
  return a

B=[0]*(n+5)
C=[0]*(n+5)

for i in range(n):
  B[i+1]=gcd(B[i],A[i])
  C[i+1]=gcd(C[i],A[n-i-1])
po=0
for i in range(n):
  po=max(po,gcd(B[i],C[n-1-i]))
print(po)