import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
INF_NEG = -10**18
class IterSegTree:
def __init__(self, data):
self.n = len(data)
self.size = 1
while self.size < self.n:
self.size *= 2
self.tree = [INF_NEG] * (2 * self.size)
self.lazy = [0] * self.size
for i in range(self.n):
self.tree[self.size + i] = data[i]
for i in range(self.n, self.size):
self.tree[self.size + i] = INF_NEG
for i in range(self.size - 1, 0, -1):
self.tree[i] = max(self.tree[2 * i], self.tree[2 * i + 1])
def _apply(self, idx, value):
self.tree[idx] += value
if idx < self.size:
self.lazy[idx] += value
def _push(self, idx):
h = self.size.bit_length()
for s in range(h, 0, -1):
i = idx >> s
if self.lazy[i]:
self._apply(2 * i, self.lazy[i])
self._apply(2 * i + 1, self.lazy[i])
self.lazy[i] = 0
def _build(self, idx):
while idx > 1:
idx //= 2
self.tree[idx] = max(self.tree[2 * idx], self.tree[2 * idx + 1]) + self.lazy[idx]
def update(self, l, r, value):
l += self.size
r += self.size
l0, r0 = l, r
while l <= r:
if l & 1:
self._apply(l, value)
l += 1
if not r & 1:
self._apply(r, value)
r -= 1
l //= 2
r //= 2
self._build(l0)
self._build(r0)
def query(self, l, r):
l += self.size
r += self.size
self._push(l)
self._push(r)
res = INF_NEG
while l <= r:
if l & 1:
res = max(res, self.tree[l])
l += 1
if not r & 1:
res = max(res, self.tree[r])
r -= 1
l //= 2
r //= 2
return res
def update_point(self, idx, new_val):
current = self.query(idx, idx)
diff = new_val - current
self.update(idx, idx, diff)
N = int(input())
A = list(map(int, input().split()))
prefix = [0] * N
seen = {}
cnt = 0
for i in range(N):
if A[i] not in seen:
seen[A[i]] = True
cnt += 1
prefix[i] = cnt
# suffix[i]: A[i..N-1] に含まれる異なる整数の個数
suffix = [0] * N
seen = {}
cnt = 0
for i in range(N-1, -1, -1):
if A[i] not in seen:
seen[A[i]] = True
cnt += 1
suffix[i] = cnt
F = [INF_NEG] * N
F[0] = prefix[0]
seg = IterSegTree(F)
last_occ = {}
ans = 0
for j in range(1, N):
v = A[j]
prev = last_occ.get(v, -1)
if max(prev, 0) <= j - 1:
seg.update(max(prev, 0), j - 1, 1)
seg.update_point(j, prefix[j])
if j - 1 >= 0 and j <= N - 2:
dp = seg.query(0, j - 1)
ans = max(ans, dp + suffix[j + 1])
last_occ[v] = j
print(ans)