思路: 枚举k 排序 枚举j 二分i
#include<algorithm>
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
inline int read(){
int x=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x;
}
int n,a[200005],b[200005],mod,ans;
int find(int x){//find largest y where b[y]<=x
int l=2,r=n,ans=1,mid;
while(l<=r){
mid=((l+r)>>1);
if(b[mid]<=x) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
signed main(){
n=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int k=1;k<=n;++k){
for(int j=1;j<=n;++j) b[j]=a[j]%a[k];
sort(b+1,b+n+1);
for(int j=2,i;j<=n;++j){
i=find(a[k]-b[j]-1);
if(i==j) --i;
if(i!=1) ans=max(ans,(b[i]+b[j])%a[k]);
ans=max(ans,(b[n]+b[j])%a[k]);
}
}
cout<<ans;
}