#include #define rep(i,n) for(int i=0; i<(int)(n); i++) using namespace std; const int Max_N=2e5, Max_A=1e8; const int INF=1e9; int main(){ int N; cin >> N; assert(N>=3 && N<=Max_N); vector A(N), test(N); rep(i,N){ int a; cin >> a; assert(a>=1 && a<=Max_A); A[i]=a, test[i]=a; } sort(test.begin(),test.end()); rep(i,N-1) assert(test[i] != test[i+1]); //最小値を探す int m=INF, m_pos; rep(i,N){ if(A[i] < m){ m=A[i]; m_pos=i; } } //左からi番目までの最小値 vector min_left(N); int ML=INF; rep(i,N){ ML=min(ML,A[i]); min_left[i]=ML; } //右からi番目までの最小値 vector min_right(N); int MR=INF; rep(i,N){ MR=min(MR,A[N-1-i]); min_right[N-1-i]=MR; } int ans=INF; //最小値が真ん中のケース if(m_pos >= 1 && m_pos < N-1){ ans=min_left[m_pos-1]+m+min_right[m_pos+1]; } //最小値が左右のケース、真ん中全探索 int res=INF; for(int i=1; i A[i]) continue; int size=left+A[i]+m; res=min(res,size); } //最小値が一番左 if(i > m_pos){ int right=min_right[i+1]; if(right > A[i]) continue; int size=m+A[i]+right; res=min(res,size); } } ans=min(ans,res); if(ans==INF) cout << -1 << endl; else cout << ans << endl; return 0; }