#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define endl '\n'
#define lc (u << 1)
#define rc (u << 1 | 1)
#define pb push_back
#define eb emplace_back
#define ep emplace
using LL = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
#define debug(x...) \
do { \
std::cout << #x << " -> "; \
err(x); \
} while (0)
void err() {
std::cout << '\n';
}
template <class T, class... Ts>
void err(T arg, Ts ...args) {
std::cout << arg << ' ';
err(args...);
}
/*
exit(0);
assert(expression); // 断言
cout << flush; // 刷新缓冲流
string line;
getline(cin, line);
stringstram sline(line); // string流
cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf; //回到正常的缓冲方式
*/
/******************************************************************/
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const long long One = 1LL;
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
struct node{
int x, y, z;
bool operator < (const node& a) const{
return x < a.x;
}
};
string s;
int n, m, k;
void solve(){
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i ++)
cin >> a[i];
// 1 ~ n
vector<int> f1(n, INT_MAX);
vector<int> ff(n);
for (int i = 0; i < n; i++){
int mid = lower_bound(f1.begin(), f1.end(), a[i]) - f1.begin();
f1[mid] = a[i];
ff[i] = mid; // 记录每个数应该在的位置
// debug(ff[i]);
}
int l1 = lower_bound(f1.begin(), f1.end(), INT_MAX) - f1.begin();
int len = l1;
// debug(len);
vector<int> v(len), vv(len);
for (int i = n - 1; ~i; i --){
if (!len)
break;
if (ff[i] == len - 1){
v[len - 1] = a[i];
vv[len - 1] = i;
len --;
}
else{
ff[i] = -1;
}
}
// for (int i = 0; i < l1; i ++)
// cout << v[i] << " \n"[i + 1 == l1];
// 2 ~ n
vector<int> f2(n, INT_MAX);
for (int i = 1; i < n; i++){
int mid = lower_bound(f2.begin(), f2.end(), a[i]) - f2.begin();
f2[mid] = a[i];
}
int l2 = lower_bound(f2.begin(), f2.end(), INT_MAX) - f2.begin();
// 1 ~ n - 1
vector<int> f3(n, INT_MAX);
for (int i = 0; i < n - 1; i++){
int mid = lower_bound(f3.begin(), f3.end(), a[i]) - f3.begin();
f3[mid] = a[i];
}
int l3 = lower_bound(f3.begin(), f3.end(), INT_MAX) - f3.begin();
// debug(l1, l2, l3);
if (l1 > l2 && l1 > l3){
for (int i = l1 - 1, j = n - 1; ~i && ~j; j --){
if (ff[j] == -1){
if (v[i] + 1 < v[i + 1]){
cout << l1 + 1 << endl;
return;
}
}
else{
i --;
}
}
for (int i = 0; i < l1 - 1; i ++){
if (v[i] + 1 != v[i + 1] && vv[i] + 1 != vv[i + 1]){
debug(v[i], vv[i]);
cout << l1 + 1 << endl;
return;
}
}
for (int i = l1 - 1; i ; i --){
if (v[i] - 1 != v[i - 1] && vv[i] - 1 != vv[i - 1]){
cout << l1 + 1 << endl;
return;
}
}
cout << l1 << endl;
}
else{
cout << l1 + 1 << endl;
}
}
signed main(void){
ios::sync_with_stdio(false);
cin.tie(0);
cout << fixed << setprecision(20);
int t = 1;
// cin >> t;
while (t --){
solve();
}
return 0;
}
/*
input:
output:
*/