//你管这个叫简单dp .jpg

#include<bits/stdc++.h>
#define ll long long
#define r(a) a=read<int>()
#define rl(a) a=read<ll>()
using namespace std;

template<class T>inline T read(){
	T sum=0,f=1;char k=getchar();
	for(;k< '0'||'9'< k;k=getchar())
		if(k=='-')f=-1;
	for(;'0'<=k&&k<='9';k=getchar())
		sum=(sum<<1)+(sum<<3)+(k^48);
	return sum*f;
}

int n,a[500050];

int f[500050];
// f :  dp用数组，f[i]表示 将 i 到 n 位置 拼成漂亮状态（是么？）的策略中，最多有多少本书 **不移动** （即它们会自然的拼到一起）
int l[500050],r[500050];
// l[a[i]] : 所有a[i]中，最左边的a[i]的位置   r[a[i]] : 最右的a[i]的位置
int fcnt[500050];
// fcnt : 当前位置的左边共有多少个a[i]

int main(){
	/*
	freopen("e.in","r",stdin);
	freopen("e.out","w",stdout);
	//*/
	r(n);
	for(int i=1;i<=n;i++)r(a[i]);
	for(int i=1;i<=n;i++){
		if(!l[a[i]])l[a[i]]=i;
		r[a[i]]=max(r[a[i]],i);
	}
	for(int i=n;i>=1;i--){
		fcnt[a[i]]++;
		f[i] = f[i+1]; //继承右边的情况
		if( i == l[a[i]] ) f[i] = max( f[i] , f[ r[a[i]] + 1 ] + fcnt[a[i]] );
			//若此时到了a[i]中最左边的位置
				//那么此时最大不移动的量要么继承f[i+1]，即所有的a[i]都要移动，
				//要么所有的a[i]都不移动，此时 r[a[i]] + 1 至 n 区域的策略不变，就可以保留 f[r[a[i]+1] + fcnta[i] 本书不变位置
		else f[i] = max ( f[i] , fcnt[a[i]] );
			//此时没有到最左
				//则要么继承f[i+1]，即所有的a[i]都要移动，
				//要么此位置右边的a[i]都不动，其他的都要移动
					//按照blog的解释，这里为了防止区间重合，在非最左的a[i]的情况下只能选择a[i]这一个颜色不动？
	}
	printf("%d\n", n-f[1] );
	return 0;
}

### Prompt

Generate a Cpp solution to the following problem:

One day you wanted to read something, so you went to your bookshelf to grab some book. But when you saw how messy the bookshelf was you decided to clean it up first.

<image>

There are n books standing in a row on the shelf, the i-th book has color a_i.

You'd like to rearrange the books to make the shelf look beautiful. The shelf is considered beautiful if all books of the same color are next to each other.

In one operation you can take one book from any position on the shelf and move it to the right end of the shelf.

What is the minimum number of operations you need to make the shelf beautiful?

Input

The first line contains one integer n (1 ≤ n ≤ 5 ⋅ 10^5) — the number of books.

The second line contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ n) — the book colors.

Output

Output the minimum number of operations to make the shelf beautiful.

Examples

Input


5
1 2 2 1 3


Output


2


Input


5
1 2 2 1 1


Output


1

Note

In the first example, we have the bookshelf [1, 2, 2, 1, 3] and can, for example: 

  1. take a book on position 4 and move to the right end: we'll get [1, 2, 2, 3, 1]; 
  2. take a book on position 1 and move to the right end: we'll get [2, 2, 3, 1, 1]. 



In the second example, we can move the first book to the end of the bookshelf and get [2,2,1,1,1].

### Response

```cpp
//你管这个叫简单dp .jpg

#include<bits/stdc++.h>
#define ll long long
#define r(a) a=read<int>()
#define rl(a) a=read<ll>()
using namespace std;

template<class T>inline T read(){
	T sum=0,f=1;char k=getchar();
	for(;k< '0'||'9'< k;k=getchar())
		if(k=='-')f=-1;
	for(;'0'<=k&&k<='9';k=getchar())
		sum=(sum<<1)+(sum<<3)+(k^48);
	return sum*f;
}

int n,a[500050];

int f[500050];
// f :  dp用数组，f[i]表示 将 i 到 n 位置 拼成漂亮状态（是么？）的策略中，最多有多少本书 **不移动** （即它们会自然的拼到一起）
int l[500050],r[500050];
// l[a[i]] : 所有a[i]中，最左边的a[i]的位置   r[a[i]] : 最右的a[i]的位置
int fcnt[500050];
// fcnt : 当前位置的左边共有多少个a[i]

int main(){
	/*
	freopen("e.in","r",stdin);
	freopen("e.out","w",stdout);
	//*/
	r(n);
	for(int i=1;i<=n;i++)r(a[i]);
	for(int i=1;i<=n;i++){
		if(!l[a[i]])l[a[i]]=i;
		r[a[i]]=max(r[a[i]],i);
	}
	for(int i=n;i>=1;i--){
		fcnt[a[i]]++;
		f[i] = f[i+1]; //继承右边的情况
		if( i == l[a[i]] ) f[i] = max( f[i] , f[ r[a[i]] + 1 ] + fcnt[a[i]] );
			//若此时到了a[i]中最左边的位置
				//那么此时最大不移动的量要么继承f[i+1]，即所有的a[i]都要移动，
				//要么所有的a[i]都不移动，此时 r[a[i]] + 1 至 n 区域的策略不变，就可以保留 f[r[a[i]+1] + fcnta[i] 本书不变位置
		else f[i] = max ( f[i] , fcnt[a[i]] );
			//此时没有到最左
				//则要么继承f[i+1]，即所有的a[i]都要移动，
				//要么此位置右边的a[i]都不动，其他的都要移动
					//按照blog的解释，这里为了防止区间重合，在非最左的a[i]的情况下只能选择a[i]这一个颜色不动？
	}
	printf("%d\n", n-f[1] );
	return 0;
}

```