#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define cint(d) scanf("%d", &d)
#define cint2(a, b) scanf("%d %d", &a, &b)
#define cint3(a, b, c) scanf("%d %d %d", &a, &b, &c)
#define cint4(a, b, c, d) scanf("%d %d %d %d", &a, &b, &c, &d)

#define clong(d) scanf("%lld", &d)
#define clong2(a, b) scanf("%lld %lld", &a, &b)
#define clong3(a, b, c) scanf("%lld %lld %lld", &a, &b, &c)
#define clong4(a, b, c, d) scanf("%lld %lld %lld %lld", &a, &b, &c, &d)

#define foreach(v, c) for(__typeof( (c).begin()) v = (c).begin();  v != (c).end(); ++v)
#define revforeach(v, c) for(__typeof( (c).rbegin()) v = (c).rbegin();  v != (c).rend(); ++v)
#define ALL(v) (v).begin(), (v).end()

#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second

typedef long long int slong;
typedef pair<int, int> pii;
typedef pair<slong, slong> pll;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;

#ifdef VSP4 
    #include "debug.h"    
#else
    #define debug(args...)                  // Just strip off all debug tokens
#endif

const int MOD = 1000000007;
#define MODSET(d) if ((d) >= MOD) d %= MOD;
#define MODNEGSET(d) if ((d) < 0) d = ((d % MOD) + MOD) % MOD;
#define MODADDSET(d) if ((d) >= MOD) d -= MOD;
#define MODADDWHILESET(d) while ((d) >= MOD) d -= MOD;

const int MAXN = 2e5;
const int SQRTN = 550;
const int LOGN = 60;
const int INT_INFINITY = 1001001001;
const int LIMIT = 1e6;

const slong LONG_INFINITY = 1001001001001001001ll;
const slong LONG_LIMIT = 800100100100101ll;

int n, m;
int a[MAXN+5];
slong data[MAXN+5];
slong countdata[MAXN+5];

int main()
{
	#ifdef VSP4
		freopen("input.txt", "r", stdin);
		freopen("output.txt", "w", stdout);
	#endif
	
	clock_t begin = clock();
	
	int t, i, j, l, r, k, x, type;
	
	cin >> n >> m;
	
	for (i = 1;  i <= n; i++)
	{
		cin >> a[i];
	}
	
	slong sureshot = 0;
	
	for (i = 1; i < n; i++)
	{
		//a[i] to a[i+1]
		
		/*
		if ((a[i+1] == a[i] + 1) || (a[i] == n && a[i+1] == 1))
		{
			sureshot++;
		}
		else
		*/
		{
			if (a[i] < a[i+1])
			{		
				int without = a[i+1] - a[i];
				//1, a[i] is useless
				
				data[1] += without;
				data[a[i]+1] -= without;
				
				debug(1, a[i], without);
				
				//a[i]+1, a[i+1]
				//1 + (a[i+1] - x) = 1 + a[i+1] - x
				
				data[a[i]+1] += 1 + a[i+1];
				data[a[i+1]+1] -= 1 + a[i+1];
				
				countdata[a[i]+1] += 1;
				countdata[a[i+1]+1] -= 1;		
				
				debug(a[i]+1, a[i+1], 1 + a[i+1], "- x");
						
				//a[i+1] + 1, m is useless
				
				data[a[i+1] + 1] += without;
				data[m+1] -= without;
				
				debug(a[i+1] + 1, m, without);
						
			}
			else
			{
				int without = m - a[i] + a[i+1];
				
				//1, a[i+1]
				//a[i+1] - x + 1 = a[i+1] + 1 - x
				
				data[1] += a[i+1] + 1;
				data[a[i+1]+1] -= a[i+1] + 1;
				
				countdata[1] += 1;
				countdata[a[i+1]+1] -= 1;
				
				debug(1, a[i+1], a[i+1] + 1, "- x");
				
				//a[i+1]+1, a[i] is useless
				
				data[a[i+1] + 1] += without;
				data[a[i]+1] -= without;
				
				debug(a[i+1]+1, a[i], without);
				
				//a[i]+1, m
				//(m - x) + a[i+1] + 1 = a[i+1] + m - x + 1
				
				data[a[i]+1] += a[i+1] + m + 1;
				data[m+1] -= a[i+1] + m + 1;
				
				countdata[a[i]+1] += 1;
				countdata[m+1] -= 1;
				
				debug(a[i]+1, m, a[i+1] + m + 1,  "- x");
				
			}
		}
	}
	
	slong ans = LONG_INFINITY;
	
	for (i = 1; i <= m; i++)
	{
		countdata[i] += countdata[i-1];
		data[i] += data[i-1];
		
		slong val = data[i] - countdata[i]*i;
		
		debug(i, val);
		
		ans = min(ans, val);
	}
	
	cout << ans;
	
	clock_t end = clock();
	double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
	
	cerr << elapsed_secs;
	
	return 0;
}


Measured memory_bytes: 2176