/**
* DP + 最长(严格)上升子序列 + 二分查找(nlogn):
* STL中有两个很好用的函数,但是一定要理解清楚了,比如返回值,如何传参。才能用好。不然还是自己写吧!
* 一个是lower_bound() 一个是 upper_bound()
* 本题只用了upper_bound():
* 函数upper_bound()返回的在前闭后开区间查找的关键字的上界,
* 如一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,
* 同样,如果插入元素大于数组中全部元素,返回的是last。(注意:此时数组下标越界!!)
* 返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <string>
#include <ctime>
#include <algorithm>
#define INF 0x7fffffff
#define MAXS 10005
#define DEBUG 0
#define LL long long
using namespace std;
int num[MAXS], dpl[MAXS], dpr[MAXS], sorted[MAXS];
int st[MAXS];
void dpf(int n) {
int rear = 1; int *t;
st[0] = -1;
for(int i = 0; i < n; i ++) {
if(num[i] > st[rear - 1]) {
st[rear ] = num[i];
dpl[i] = rear ++;
} else {
t = upper_bound(st, st + rear, num[i]);
if(*(t - 1) == num[i]) t --;
*t = num[i];
dpl[i] = t - st;
}
}
rear = 1;
for(int i = n - 1; i >= 0; i --) {
if(num[i] > st[rear - 1]) {
st[rear] = num[i];
dpr[i] = rear ++;
} else {
t = upper_bound(st, st + rear, num[i]);
if(*(t - 1) == num[i]) t --;
*t = num[i];
dpr[i] = t - st;
}
}
}
int main()
{
int n;
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; i ++) {
scanf("%d", &num[i]);
}
dpf(n);
int ans, cur;
ans = 0;
for(int i = 0; i < n; i ++) {
cur = min(dpl[i], dpr[i]) * 2;
if(cur > ans) ans = cur;
}
printf("%d\n", ans - 1);
}
return 0;
}