/*
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sqrt(a) sqrtl(a)
#define abs(a) llabs(a)
#define pow(a) powl(a)
typedef pair<int,int> pi ;
#define if1(x) for(int i =1 ;i<=x;i++)
#define if0(x) for(int i = 0;i<x;i++)
#define jf0(x) for(int j = 0;j<x;j++)
#define jf1(x) for(int j = 1;j<=x;j++)
#define pb push_back
const int mod = 1e9+7;
const int inf = 0xFFFFFFFFFFFFFFF;
const int N = 3e5+10;
int w[N];
int difn[N];
struct Node {
int l, r;
int mx;
int add; // 懒标记
} tr[4*N];
void pushup(int u) {
//int lc = u<<1,rc = u<<1|1;
tr[u].mx = max(tr[u<<1].mx , tr[u<<1|1].mx) ;
}
void pushdown(int u) {
if (tr[u].add == 0) return;
auto &root = tr[u];
auto &left = tr[u<<1];
auto &right = tr[u<<1|1];
//自己已经是加过的mx了
// tr[u].mx += root.add;
left.add += root.add;
right.add += root.add;
left.mx += root.add;
right.mx += root.add;
root.add = 0;
// root.add = 0;
// left.sum += (left.r - left.l + 1) * root.add;
// left.add += root.add;
// right.sum += (right.r - right.l + 1) * root.add;
// right.add += root.add;
// root.add = 0;
}
void build(int u, int l, int r) {
tr[u] = {l, r};
if (l == r) {
tr[u].mx = w[l];
return;
}
int mid = (l + r) >> 1;
build(u<<1, l, mid);
build(u<<1|1, mid+1, r);
pushup(u);
}
int query(int u, int l, int r) {
if (l <= tr[u].l && r >= tr[u].r) {
return tr[u].mx;
}
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
int v = 0;
if (l <= mid) {
v = query(u<<1, l, r);
}
if (r > mid) {
v = max(v,query(u<<1|1, l, r));
}
return v;
}
void modify(int u, int l, int r, int v) {
if (l <= tr[u].l && r >= tr[u].r) {
tr[u].mx += v;
// tr[u].sum += (tr[u].r - tr[u].l + 1) * v;
tr[u].add += v;
} else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if (l <= mid) {
modify(u<<1, l, r, v);
}
if (r > mid) {
modify(u<<1|1, l, r, v);
}
pushup(u);
}
}
void solve(){
int m,n;
cin>>n;
map<int,int > mp;
vector<int> num(n+10);
if1(n)cin>>num[i];
for(int i =n;i>=1;i--){
mp[num[i]] ++;
difn[i] = mp.size();
}
mp.clear();
build(1,1,n);
//wi表示,0-i-1,为一段,i-now为一段
int ans = 0;
if1(n-1){
int p3 = difn[i+1];
modify(1,i,i,mp.size());
//第二段更新
if(!mp.count(num[i])){
//之前没有出现过,那么所有的第二段都需要+1
modify(1,1,i,1);
}else{
int p2 = mp[num[i]];
modify(1,p2+1,i,1);
}
mp[num[i]] = i;
int res = query(1,1,i);
ans = max(ans,res+p3);
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t=1;
// cin>>t;
while (t--)
{
solve();
}
return 0;
}
/*
*/