#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define ldb long double
#define mt make_tuple
const int N=100050;
const ll inf=9e18;
int n,m,a[N];
ll sol,bsol;
void input()
{
	scanf("%i %i",&n,&m);
	for(int i=1;i<=n;i++) scanf("%i",&a[i]);
}
void output()
{
	printf("%lld\n",sol);
}
struct DataStructure
{
	ll sum,cnt[2];
	int sz;
	DataStructure(){ sum=cnt[0]=cnt[1]=sz=0;}
	void Flip(int x)
	{
		cnt[x^1]-=sz;
		sum+=cnt[x^1]-cnt[x];
		cnt[x]+=sz;
	}
	void AddRow(int zero, int one)
	{
		sum+=(ll)zero*one;
		sz++;
		cnt[0]+=zero;
		cnt[1]+=one;
	}
	void DelRow(int zero, int one)
	{
		sum-=(ll)zero*one;
		sz--;
		cnt[0]-=zero;
		cnt[1]-=one;
	}
};
int cnt[N];
void Solve()
{
	for(int i=0;i<=m;i++) cnt[i]=0;
	for(int i=1;i<=n;i++) cnt[a[i]]++;
	DataStructure L,R;
	int sz=0;
	for(int i=1;i<=m;i++)
	{
		sz+=cnt[i-1];
		R.AddRow(n-sz,sz);
	}
	sol=R.sum;
	sz=0;
	for(int j=0;j<cnt[0];j++) R.Flip(0);
	R.DelRow(n,0);
	sol=min(sol,R.sum);
	for(int i=1;i<=m;i++)
	{
		if(i!=m)
		{
			for(int j=0;j<cnt[i];j++) R.Flip(0);
			R.DelRow(n,0);
		}
		L.AddRow(n,0);
		for(int j=0;j<cnt[i];j++) L.Flip(1);
		sol=min(sol,L.sum+R.sum);
	}
}
void Run()
{
	input();
	Solve();
	output();
}
void BruteForce()
{
	bsol=inf;
	for(int mask=0;mask<1<<n;mask++)
	{
		for(int i=1;i<=m;i++) cnt[i]=0;
		for(int i=1;i<=n;i++)
		{
			if((mask>>(i-1))&1)
			{
				for(int j=1;j<=a[i];j++) cnt[j]++;
			}
			else
			{
				for(int j=a[i]+1;j<=m;j++) cnt[j]++;
			}
		}
		ll tmp=0;
		for(int i=1;i<=m;i++) tmp+=(ll)cnt[i]*(n-cnt[i]);
		bsol=min(bsol,tmp);
	}
}
void MakeTestCase()
{
	n=rand()%10+1;
	m=rand()%10000+1;
	for(int i=1;i<=n;i++)
	{
		a[i]=rand()%(m+1);
	}
}
bool Compare()
{
	return sol==bsol;
}
void Print()
{
	printf("%i %i\n",n,m);
	for(int i=1;i<=n;i++) printf("%i ",a[i]);
	printf("\n");
	printf("Solve: %lld\n",sol);
	printf("Brute: %lld\n",bsol);
}
double GetTime(){ return (ldb)clock()/CLOCKS_PER_SEC;}
double s_time,e_time,d_time;
void Start(){ s_time=GetTime();}
void Stop(){ e_time=GetTime();d_time=e_time-s_time;}
void Test()
{
	cout<<fixed<<setprecision(4);
	int work=100000;
	double max_time=0;
	bool speed_only=0;
	for(int i=1;i<=work;i++)
	{
		MakeTestCase();
		if(!speed_only) BruteForce();
		Start();
		Solve();
		Stop();
		if(!speed_only && !Compare())
		{
			Print();
			return;
		}
		max_time=max(max_time,d_time);
		cout<<i<<":OK, max time so far="<<max_time<<"\n";
	}
	cout<<":D\n";
}
int main()
{
	bool test=0;
	if(test) Test();
	else Run();
	return 0;
}