Problem: You are given an array a of n integers. Define the cost of some array t as follows:

$$$cost(t) = ∑_{x ∈ set(t) } last(x) - first(x),$$$ 

where set(t) is the set of all values in t without repetitions, first(x), and last(x) are the indices of the first and last occurrence of x in t, respectively. In other words, we compute the distance between the first and last occurrences for each distinct element and sum them up.

You need to split the array a into k consecutive segments such that each element of a belongs to exactly one segment and the sum of the cost of individual segments is minimum.

Input

The first line contains two integers n, k (1 ≤ n ≤ 35 000, 1 ≤ k ≤ min(n,100)).

The second line contains n integers a_1, a_2, …, a_n (1 ≤ a_i ≤ n).

Output

Output the minimum sum of the cost of individual segments.

Examples

Input


7 2
1 6 6 4 6 6 6


Output


3


Input


7 4
5 5 5 5 2 3 3


Output


1

Note

In the first example, we can divide the array into [1,6,6,4] and [6,6,6]. Cost of [1,6,6,4] will be (1-1) + (3 - 2) + (4-4) = 1 and cost of [6,6,6] will be 3-1 = 2. Total cost would be 1 + 2 = 3.

In the second example, divide the array into [5,5],[5],[5,2,3] and [3]. Total Cost would be 1 + 0 + 0 + 0 = 1.

Solution (in CPP):

Solution:
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX_N=35010;
const int INF=0x3f3f3f3f;
struct node{
 	int l,r,minl,lazy;
}a[MAX_N*4];
int dp[MAX_N],b[MAX_N];
void update(int k){
 	//a[k].sum=a[k<<1].sum+a[k<<1|1].sum;
 	a[k].minl=min(a[k<<1].minl,a[k<<1|1].minl);
}
void build(int k,int l,int r){
 	a[k].l=l;a[k].r=r;a[k].lazy=0;
 	if(l==r){
  		a[k].minl=dp[l];
  		return;
 	}
 	int mid=(l+r)>>1;
 	build(k<<1,l,mid);
 	build(k<<1|1,mid+1,r);
 	update(k);
}
void pushdown(int k){
 	if(a[k].lazy==0)
 	return;
 	a[k<<1].lazy+=a[k].lazy;
	a[k<<1|1].lazy+=a[k].lazy;
 	a[k<<1].minl+=a[k].lazy;
 	a[k<<1|1].minl+=a[k].lazy;
 	a[k].lazy=0;
}
void changeS(int k,int l,int r,int y){
 	if(a[k].l>=l&&a[k].r<=r){
  		a[k].minl+=y;
  		a[k].lazy+=y;
  		return;
 	}
 	pushdown(k);
 	int mid=(a[k].l+a[k].r)>>1;
 	if(l<=mid)
 	changeS(k<<1,l,r,y);
 	if(r>mid)
 	changeS(k<<1|1,l,r,y);
 	update(k);
}
int query(int k,int l,int r){	
 	if(a[k].l>=l&&a[k].r<=r)
 	return a[k].minl;
 	pushdown(k);
 	int mid=(a[k].l+a[k].r)>>1;
 	int res=INF;
 	if(l<=mid)
 	res=min(res,query(k<<1,l,r));
 	if(r>mid)
 	res=min(res,query(k<<1|1,l,r));
 	return res;
}
int rk[MAX_N],pre[MAX_N];
int main(void){
	int n,k,i,j;
	scanf("%d%d",&n,&k);
	for(i=1;i<=n;i++)
	scanf("%d",&b[i]);
	for(i=1;i<=n;i++){
		pre[i]=rk[b[i]];
		rk[b[i]]=i;
	}
	for(j=1;j<=n;j++)
	dp[j]=INF;
	for(i=1;i<=k;i++){
		for(j=0;j<i-1;j++)
		dp[j]=INF;
		build(1,0,n);
		for(j=i;j<=n;j++){
			int val=j-pre[j];
			if(pre[j]==0)
			val=0;
			//cout<<pre[j]-1<<" "<<val<<" !!!\n";
			if(pre[j])
			changeS(1,0,pre[j]-1,val);
			dp[j]=query(1,0,j-1);
			//changeS(1,j,j,dp[j]); 
		}
//		for(j=0;j<=n;j++)
//		cout<<dp[j]<<" ";
//		cout<<"\n";
	}
	printf("%d\n",dp[n]);
	return 0;
}