// Original C++ solution (slower):
#include <bits/stdc++.h>





using namespace std;

typedef long long LL;

const int N = 2e5 + 7;

const LL Inf = 1e10;

struct Node{

	LL a,b;	

}st[N << 2];

LL tag;

LL tmp;

LL ans = Inf;

int n,q,A,B;

#define ls (rt << 1)

#define rs (rt << 1 | 1)

#define Mid (L + R >> 1)

void Up(int rt){

	st[rt].a = min(st[ls].a,st[rs].a);

	st[rt].b = min(st[ls].b,st[rs].b);

}

void Build(int L = 1,int R = n,int rt = 1){

	if(L == R){

		st[rt].a = Inf;

		st[rt].b = Inf;

		if(L == A)st[rt].a = -L,st[rt].b = L;

		return;

	}

	Build(L,Mid,ls);

	Build(Mid + 1,R,rs);

	Up(rt);

}

void Qa(int r,int L = 1,int R = n,int rt = 1){

	if(L > r || st[rt].a >= tmp)return;

	if(R <= r)return tmp = st[rt].a,void();

	Qa(r,L,Mid,ls);Qa(r,Mid + 1,R,rs);

}

void Qb(int l,int L = 1,int R = n,int rt = 1){

	if(R < l || st[rt].b >= tmp)return;

	if(L >= l)return tmp = st[rt].b,void();

	Qb(l,L,Mid,ls);Qb(l,Mid + 1,R,rs);

}

void Modify(int x,LL k,int L = 1,int R = n,int rt = 1){

	if(L == R){

		st[rt].a = min(st[rt].a,k - L);

		st[rt].b = min(st[rt].b,k + L);

		return;

	}

	if(x <= Mid)Modify(x,k,L,Mid,ls);

	else Modify(x,k,Mid + 1,R,rs);

	Up(rt);

}

void Get(int L = 1,int R = n,int rt = 1){

	if(L == R)return ans = min(ans,st[rt].a + L),void();

	Get(L,Mid,ls);Get(Mid + 1,R,rs);

}

int main(){

#ifdef WTY

	freopen("in","r",stdin);

#endif

	cin >> n >> q >> A >> B;

	Build();

	for(int i = 1,last = B,x; i <= q; i++){

		scanf("%d",&x);

		LL val = 0;

		tmp = Inf;

		Qa(x);

		val = tmp + x;

		tmp = Inf;

		Qb(x + 1);

		val = min(val,tmp - x) + tag;

		tag += abs(x - last);

		Modify(last,val - tag);

		last = x;

	}

	Get();

	cout << ans + tag << endl;

	return 0;

}


// Optimized solution to the same problem (faster):
#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

inline int gi()

{

	char c;int num=0,flg=1;

	while((c=getchar())<'0'||c>'9')if(c=='-')flg=-1;

	while(c>='0'&&c<='9'){num=num*10+c-48;c=getchar();}

	return num*flg;

}

#define N 200005

#define LL long long

#define lc i<<1

#define rc i<<1|1

const LL INF=0x3f3f3f3f3f3f3f3fll;

int pos[N],A,B,n,Q;

struct node{

	int l,r;

	LL mi1,mi2,la;

}a[N<<2];

void cal(int i,LL k){a[i].mi1+=k;a[i].mi2+=k;a[i].la+=k;}

void pushdown(int i)

{

	if(a[i].la&&a[i].l<a[i].r){

		cal(lc,a[i].la);cal(rc,a[i].la);

		a[i].la=0;

	}

}

void pushup(int i)

{

	a[i].mi1=min(a[lc].mi1,a[rc].mi1);

	a[i].mi2=min(a[lc].mi2,a[rc].mi2);

}

void build(int i,int l,int r)

{

	a[i].l=l;a[i].r=r;

	if(l==r){

		a[i].mi1=INF;a[i].mi2=INF;

		return;

	}

	int mid=(l+r)>>1;

	build(lc,l,mid);build(rc,mid+1,r);

	pushup(i);

}

void insert(int i,int l,int r,LL k)

{

	if(a[i].l>r||a[i].r<l)return;

	pushdown(i);

	if(l<=a[i].l&&a[i].r<=r){cal(i,k);return;}

	insert(lc,l,r,k);insert(rc,l,r,k);

	pushup(i);

}

void modify(int i,int x,LL k)

{

	if(a[i].l>x||a[i].r<x)return;

	pushdown(i);

	if(x==a[i].l&&a[i].r==x){a[i].mi1=min(a[i].mi1,k-x);a[i].mi2=min(a[i].mi2,k+x);return;}

	modify(lc,x,k);modify(rc,x,k);

	pushup(i);

}

LL query1(int i,int l,int r)

{

	if(a[i].l>r||a[i].r<l)return INF;

	pushdown(i);

	if(l<=a[i].l&&a[i].r<=r)return a[i].mi1;

	return min(query1(lc,l,r),query1(rc,l,r));

}

LL query2(int i,int l,int r)

{

	if(a[i].l>r||a[i].r<l)return INF;

	pushdown(i);

	if(l<=a[i].l&&a[i].r<=r)return a[i].mi2;

	return min(query2(lc,l,r),query2(rc,l,r));

}

LL query(int i)

{

	if(a[i].l==a[i].r)return a[i].mi1+a[i].l;

	pushdown(i);

	return min(query(lc),query(rc));

}

int ab(int x){return x<0?-x:x;}

int main()

{

	int i;LL f;

	n=gi();Q=gi();A=gi();B=gi();

	build(1,1,n);

	pos[0]=A;modify(1,B,0);

	for(i=1;i<=Q;i++){

		pos[i]=gi();

		f=min(query1(1,1,pos[i])+pos[i],query2(1,pos[i]+1,n)-pos[i]);

		insert(1,1,n,ab(pos[i]-pos[i-1]));

		modify(1,pos[i-1],f);

	}

	printf("%lld\n",query(1));

}

// Fastest known solution for this problem: