#include<bits/stdc++.h>
#define ll long long
#define inf 100000000000LL
#define N 200005
using namespace std;
ll n,m,a[N],y,tg[N*4];
struct T
{
	ll x,y;
}s1[N*4],s2[N*4];
void up(ll k)
{
	ll l=k<<1,r=l^1;
	s1[k]=s1[l].y-s1[l].x<s1[r].y-s1[r].x?s1[l]:s1[r];
	s2[k]=s2[l].y+s2[l].x<s2[r].y+s2[r].x?s2[l]:s2[r];
}
void add(ll k,ll x)
{
	tg[k]+=x;
	s1[k].y+=x;
	s2[k].y+=x;
}
void dn(ll k)
{
	if (tg[k])
	{
		add(k<<1,tg[k]);add(k<<1|1,tg[k]);
		tg[k]=0;
	}
}
void build(ll k,ll l,ll r)
{
	if (l==r){s1[k]=s2[k]=(T){l,inf};return;}
	ll mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	up(k);
}
void add(ll k,ll l,ll r,ll x,ll y,ll p)
{
	if (x<=l&&r<=y){add(k,p);return;}
	ll mid=l+r>>1;dn(k);
	if (x<=mid) add(k<<1,l,mid,x,y,p);
	if (y>mid) add(k<<1|1,mid+1,r,x,y,p);
	up(k);
}
ll Get1(ll k,ll l,ll r,ll x,ll y)
{
	if (x<=l&&r<=y) return s1[k].y-s1[k].x;
	ll mid=l+r>>1,ans=inf*10;dn(k);
	if (x<=mid) ans=min(ans,Get1(k<<1,l,mid,x,y));
	if (y>mid) ans=min(ans,Get1(k<<1|1,mid+1,r,x,y));
	return ans;
}
ll Get2(ll k,ll l,ll r,ll x,ll y)
{
	if (x<=l&&r<=y) return s2[k].y+s2[k].x;
	ll mid=l+r>>1,ans=inf*10;dn(k);
	if (x<=mid) ans=min(ans,Get2(k<<1,l,mid,x,y));
	if (y>mid) ans=min(ans,Get2(k<<1|1,mid+1,r,x,y));
	return ans;
}
ll Get(ll k,ll l,ll r)
{
	if (l==r)
	{
		return s1[k].y;
	}
	ll mid=l+r>>1;dn(k);
	return min(Get(k<<1|1,mid+1,r),Get(k<<1,l,mid));
}
int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&a[0],&y);
	build(1,1,n);
	add(1,1,n,y,y,-inf);
	Get(1,1,n);
	for (ll i=1;i<=m;i++)
	{
		scanf("%lld",&a[i]);
//a[i]=rand()%n+1;
//cout<<i<<endl;
		ll t1=Get1(1,1,n,1,a[i])+a[i],t2=Get2(1,1,n,a[i],n)-a[i];
		ll tmp=min(t1,t2);
		add(1,1,n,1,n,abs(a[i]-a[i-1]));
		ll t3=Get1(1,1,n,a[i-1],a[i-1])+a[i-1];
		if (tmp<t3)add(1,1,n,a[i-1],a[i-1],tmp-t3);
		//Get(1,1,n);
	}
	printf("%lld\n",Get(1,1,n));
}