#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

#define fin "\n"
#define FOR(i,bg,ed) for(int i=(bg);i<(ed);i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second
#define pb push_back
#define DEBUG if(0)
#define REC(ret, ...) std::function<ret (__VA_ARGS__)>
template <typename T>inline bool chmin(T &l,T r)
{bool a=l>r;if(a)l=r;return a;}
template <typename T>inline bool chmax(T &l,T r)
{bool a=l<r;if(a)l=r;return a;}
template <typename T>
istream& operator>>(istream &is,vector<T> &v){
    for(auto &it:v)is>>it;
    return is;
}

int N,Q,a,b;
const LL INF = 1e15;
typedef pair<LL,LL> A;
typedef LL B;
struct node{
    A a;
    B ad;
};
#define isB (1<<0)
A mg(node& v,int l,int r){
    return A(v.a.fi+v.ad,v.a.se+v.ad);
}
A mg(A l,A r,int a,int b,int c){
    return A(min(l.fi,r.fi+(b-a)),min(l.se+(c-b),r.se));
}
namespace ST{
    node mem[1][1123456];
    int cnt=0;
    node* get(){return mem[cnt++];}
}
struct seg_tree{
    int size;
    node *seg;
    void init(int l,int r,int k=0){
        auto &v=seg[k];
        //flag関連の処理
        v.ad=0;

        if(r-l==1){
            //葉の時の処理
            v.a=A(INF,INF);
        }
        else if(r-l>1){
            int m=(l+r)/2;
            init(l,m,k*2+1);init(m,r,k*2+2);
            v.a=mg(mg(seg[k*2+1],l,m),mg(seg[k*2+2],m,r),l,m,r);
        }
    }
    seg_tree(int n){
        size=1;
        while(size<n)size*=2;
        seg=ST::get();
        init(0,size);
    }
    inline void push(int k,int l,int r){
        if(r-l<=1)return;
        auto &v=seg[k];
        auto &lg=seg[2*k+1];
        auto &rg=seg[2*k+2];
        if(v.ad){
            lg.ad+=v.ad;
            rg.ad+=v.ad;            
        }
        v.ad=0;
    }
#define LQ a,b,k*2+1,l,m
#define RQ a,b,k*2+2,m,r
    A get(int a,int b,int k,int l,int r){
        if(a<=l&&r<=b)return mg(seg[k],l,r);
        push(k,l,r);          
        int m=(l+r)/2;
        bool ll=!(m<=a||b<=l);
        bool rr=!(r<=a||b<=m);
        A ret;
        if(ll&&rr)
            ret=mg(get(LQ),get(RQ),max(l,a),m,min(r,b));
        else if(ll)ret=get(LQ);
        else ret=get(RQ);
        seg[k].a=mg(mg(seg[k*2+1],l,m),mg(seg[k*2+2],m,r),l,m,r);
        //printf("[%d,%d) = (%lld,%lld)\n",l,r,ret.fi,ret.se);

        return ret;
    }
    A get(int a,int b){
        //printf("[%d,%d)\n",a,b);
        return get(a,b,0,0,size);
    }
    void update(int a,int b,int k,int l,int r,LL v){
        if(r<=a||b<=l)return;
        if(a<=l&&r<=b){
            seg[k].ad+=v;
        }
        else{
            push(k,l,r);           
            int m=(l+r)/2;
            update(LQ,v);
            update(RQ,v);
            seg[k].a=mg(mg(seg[k*2+1],l,m),mg(seg[k*2+2],m,r),l,m,r);
        }
    }
    void insert(int a,int b,int k,int l,int r,LL v){
        if(r<=a||b<=l)return;
        if(a<=l&&r<=b){
            LL now =seg[k].a.fi+seg[k].ad;
            seg[k].ad=0;
            chmin(v,now);
            seg[k].a=A(v,v);
        }
        else{
            push(k,l,r);           
            int m=(l+r)/2;
            insert(LQ,v);
            insert(RQ,v);
            seg[k].a=mg(mg(seg[k*2+1],l,m),mg(seg[k*2+2],m,r),l,m,r);
        }
    }

    void insert(int a,LL val){
        insert(a,a+1,0,0,size,val);
    }
    void add(int a,int b,B val){
        update(a,b,0,0,size,val);
    }
};

int main(){
    scanf("%d %d %d %d",&N,&Q,&a,&b);
    a--;b--;
    seg_tree st(N);
    int x;     
    {
        scanf("%d",&x);
        x--;
        st.insert(a,abs(b-x));
        st.insert(b,abs(a-x));

    }
    FOR(q,1,Q){
        int y;
        scanf("%d",&y);
        y--;
        int diff = abs(x-y);
        LL z = min(st.get(0,y+1).se,st.get(y,N).fi);
        //cout<<z<<endl;
        st.add(0,N,diff);
        st.insert(x,z);
        x=y;
    }
    LL res = INF;
    REP(i,N){
        chmin(res,st.get(i,i+1).fi);
    }
    printf("%lld\n",res);
    return 0;
}


Measured memory_bytes: 26624