from bisect import * def LIS(A): # weakly increase --> bisect_right # strictly increase --> bisect_left data = [] L = [0] for i in range(N): ind = bisect_right(data, A[i]) if len(data) == ind: data.append(A[i]) else: data[ind] = A[i] L.append(len(data)) return L N = int(input()) A = list(map(int, input().split())) LU = LIS(A) A.reverse() RU = LIS(A) A = list(map(lambda x : -x, A)) RD = LIS(A) A.reverse() LD = LIS(A) RU.reverse() RD.reverse() ans = 0 for i in range(N + 1): ans = max(ans, min(LU[i], RU[i])) ans = max(ans, min(LD[i], RD[i])) print(ans)