#include <iostream>

using namespace std;

void shellsort(int a[], int n)
{ int gap, i, j, tmp, put;
  for (gap = n/2; gap > 0; gap /= 2)
      for (i = gap; i < n; i++) //jedina razlika je gap umesto 1
       {   tmp = a[i]; put=0;
           for (j=i-gap; j>=0 ; j-=gap)
            {  if (a[j]>tmp) a[j+gap]=a[j];
              else { a[j+gap]=tmp; put= 1; break;}
           }
          if(put==0) a[j+gap] = tmp;
       }
}

int main()
{ int i, k, n, m, *niz, boj, nule, pune;
  long long nm, dos, maxdos;
  cin >>n>>m;
  nm= (long long) n*m;
  niz = new int[n+2];

  for(i=0;i<n;i++) cin>> niz[i];
  shellsort(niz, n);//uredi niz
  for(i=n;i>0;i--) niz[i]=niz[i-1];//pomeri desno zbog indexa
  niz[0]= -1; niz[n+1]=m+1;//postavi granicnike
  i=1; nule =0;
  while(niz[i]==0) nule++,i++;//prebroji nule
  i=n; pune =0;
  while(niz[i] == m) pune++,i--;//prebroji pune
  //dosada za nule i pune
  boj=0; maxdos=0;
  for(i=1;i<=n;i++)//algoritam za racunanje dosade
    {if(niz[i]!= boj)
       { maxdos += (niz[i]-boj)*(i-1)*(n-i+1);
         boj=niz[i];
       }
    }
  //prebaci sve u nule i dosada
  for(i=n-pune;i>0;i--) niz[i+pune]=niz[i];
  for(i=1;i<=pune;i++) niz[i]=0;
  nule += pune; pune =0;
  boj=0;dos=0;
  for(i=1;i<=n;i++)
    {if(niz[i]!= boj)
       { dos += (niz[i]-boj)*(i-1)*(n-i+1);
         boj=niz[i];
       }
    }
  if(dos<maxdos) maxdos = dos;
  //prebaci sve u pune i dosada
  for(i=nule;i<=n;i++) niz[i-nule]=niz[i];
  for(i=0;i<nule;i++) niz[n-i]=n;
  pune = nule; nule =0;
  boj=0;dos=0;
  for(i=1;i<=n;i++)
    {if(niz[i]!= boj)
       { dos += (niz[i]-boj)*(i-1)*(n-i+1);
         boj=niz[i];
       }
    }
  if(dos<maxdos) maxdos = dos;
  cout<<maxdos;
  return 0;
}