#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;

const int N=200005;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,q,a,b,x[N];
ll mn[3][N*4],tag[N*4];

void pushup(int x){
	for(int i=0;i<3;i++)
		mn[i][x]=min(mn[i][x<<1],mn[i][x<<1|1]);
}
void add(int x,ll y){
	for(int i=0;i<3;i++)mn[i][x]+=y;
	tag[x]+=y;
}
void pushdown(int x){
	if(tag[x]){
		add(x<<1,tag[x]);
		add(x<<1|1,tag[x]);
		tag[x]=0;
	}
}
void build(int x,int l,int r){
	if(l==r){
		mn[0][x]=mn[1][x]=mn[2][x]=inf;
		if(l==b)mn[0][x]=0,mn[1][x]=l,mn[2][x]=-l;
		return;
	}
	int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}
ll query(ll *mn,int x,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr)return mn[x];
	pushdown(x);
	int mid=l+r>>1;
	ll ans=inf;
	if(ql<=mid)ans=query(mn,x<<1,l,mid,ql,qr);
	if(qr>mid)ans=min(ans,query(mn,x<<1|1,mid+1,r,ql,qr));
	return ans;
}
void modify(int x,int l,int r,int p,ll v){
	if(l==r){
		if(v<mn[0][x]){
			mn[0][x]=v;
			mn[1][x]=v+l;
			mn[2][x]=v-l;
		}
		return;
	}
	pushdown(x);
	int mid=l+r>>1;
	if(p<=mid)modify(x<<1,l,mid,p,v);
	else modify(x<<1|1,mid+1,r,p,v);
	pushup(x);
}

int main(){
	scanf("%d%d%d%d",&n,&q,&a,&b);
	x[0]=a;
	build(1,1,n);
	for(int i=1;i<=q;i++){
		scanf("%d",x+i);
		ll tmp=min(query(mn[2],1,1,n,1,x[i])+x[i],query(mn[1],1,1,n,x[i],n)-x[i]);
		add(1,abs(x[i]-x[i-1]));
		modify(1,1,n,x[i-1],tmp);
	}
	printf("%lld\n",mn[0][1]);
	return 0;
}
