#include<bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e6+10;
const ll INF=1ll<<60;
int n,q,a,b,x[MAXN];

#define mid ((l+r)>>1)
#define ls k<<1
#define rs k<<1|1
#define lc k<<1,l,mid
#define rc k<<1|1,mid+1,r
ll mn[MAXN][2],dp[MAXN],tag[MAXN];
void add(int k,ll v)
{if(dp[k]==INF) return;tag[k]+=v;dp[k]+=v;mn[k][0]+=v;mn[k][1]+=v;}
void pushdown(int k)
{
    if(!tag[k]) return;
    add(ls,tag[k]);add(rs,tag[k]);tag[k]=0;
}
void pushup(int k)
{
    dp[k]=min(dp[ls],dp[rs]);
    mn[k][0]=min(mn[ls][0],mn[rs][0]);
    mn[k][1]=min(mn[ls][1],mn[rs][1]);
}
void update(int x,ll v,int k,int l,int r)
{
    if(l==r)
    {
        if(dp[k]>v) dp[k]=v,mn[k][0]=v-l,mn[k][1]=v+l;
        return;
    }
    pushdown(k);
    if(x<=mid) update(x,v,lc);
    else update(x,v,rc);
    pushup(k);
}
ll query(int a,int b,int op,int k,int l,int r)
{
    if(a>b) return INF;
    if(a<=l&&r<=b) return mn[k][op];
    ll ret=INF;
    pushdown(k);
    if(a<=mid) ret=min(ret,query(a,b,op,lc));
    if(b>mid) ret=min(ret,query(a,b,op,rc));
    return ret;
}

int main()
{
    scanf("%d%d%d%d",&n,&q,&a,&b);
    for(int i=0;i<MAXN;i++)
        dp[i]=mn[i][0]=mn[i][1]=INF;
    for(int i=1;i<=q;i++) scanf("%d",&x[i]);
    update(a,abs(b-x[1]),1,1,n);
    update(b,abs(a-x[1]),1,1,n);
    
    for(int i=2;i<=q;i++)
    {
        ll t1=query(1,x[i],0,1,1,n)+x[i];
        ll t2=query(x[i]+1,n,1,1,1,n)-x[i];
        add(1,abs(x[i]-x[i-1]));
        update(x[i-1],min(t1,t2),1,1,n);
    }
    printf("%lld",dp[1]);
    return 0;
}