#include #include #include #include #include #include #include #include #include #include #include #include typedef unsigned long long ULLONG; typedef long long LLONG; static const LLONG MOD_NUM = 1000000007;//998244353; template static void getval(_T& a) { std::cin >> a; } template static void getval(_T& a, _T& b) { std::cin >> a >> b; } template static void getval(_T& a, _T& b, _T& c) { std::cin >> a >> b >> c; } static void exec(); int main() { exec(); fflush(stdout); return 0; } static void exec() { int N; getval(N); std::vector ai(N), minL(N + 1, MOD_NUM), minR(N + 1, MOD_NUM); LLONG minVal = MOD_NUM; std::set left, right; for (int i = 0; i < N; i++) { getval(ai[i]); minL[i + 1] = minL[i]; if (minVal > ai[i]) { minVal = ai[i]; minL[i + 1] = minVal; } right.insert(ai[i]); } minVal = MOD_NUM; for (int i = N - 1; i > 0; i--) { minR[i] = minR[i + 1]; if (minVal > ai[i]) { minVal = ai[i]; minR[i] = minVal; } } LLONG ans = MOD_NUM, pta = 0, ptb = 0; left.insert(ai[0]); right.erase(ai[0]); for (int i = 1; i < N - 1; i++) { if ((minL[i] < ai[i]) && (ai[i] > minR[i])) { pta = minL[i] + ai[i] + minR[i]; if (ans > pta) { ans = pta; } } right.erase(ai[i]); auto lm = left.lower_bound(ai[i]); auto rm = right.lower_bound(ai[i]); if (lm != left.end() && rm != right.end()) { ptb = *lm + ai[i] + *rm; if (ans > ptb) { ans = ptb; } } left.insert(ai[i]); } if (ans >= MOD_NUM) ans = -1; printf("%lld\n", ans); }