#include"bits/stdc++.h"


#define PB push_back
#define PF push_front
#define LB lower_bound
#define UB upper_bound
#define fr(x) freopen(x,"r",stdin)
#define fw(x) freopen(x,"w",stdout)
#define iout(x) printf("%d\n",x)
#define lout(x) printf("%lld\n",x)
#define REP(x,l,u) for(int x = (l);x<=(u);x++)
#define RREP(x,l,u) for(int x = (l);x>=(u);x--)
#define mst(x,a) memset(x,a,sizeof(x))
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define MP make_pair
#define se second
#define fi first
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
#define sz(x) ((int)x.size())
#define cl(x) x.clear()

typedef  long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
using namespace std;

const int maxn = 200010;
const int mod = 1e9+7;
const ll MAX = 1e18;
const double eps = 1e-6;
const double PI = acos(-1);

template<typename T> inline void read(T &x){
x=0;T f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do x=x*10+ch-'0',ch=getchar();while(ch<='9'&&ch>='0');x*=f;
}

template<typename A,typename B> inline void read(A&x,B&y){read(x);read(y);}
template<typename A,typename B,typename C> inline void read(A&x,B&y,C&z){read(x);read(y);read(z);}
template<typename A,typename B,typename C,typename D> inline void read(A&x,B&y,C&z,D&w){read(x);read(y);read(z);read(w);}
template<typename A,typename B> inline A fexp(A x,B p){A ans=1;for(;p;p>>=1,x=1LL*x*x%mod)if(p&1)ans=1LL*ans*x%mod;return ans;}
template<typename A,typename B> inline A fexp(A x,B p,A mo){A ans=1;for(;p;p>>=1,x=1LL*x*x%mo)if(p&1)ans=1LL*ans*x%mo;return ans;}

int n,A,B;

int x[maxn];

int hs[maxn],cnt;

struct Node{
	int l,r;
	ll mn[3],bj;
}T[maxn<<2];

void add(int i,ll y){
	REP(j,0,2)T[i].mn[j]+=y;
	T[i].bj+=y;
}

void pushdown(int i){
	if(T[i].bj){
		add(i<<1,T[i].bj);
		add(i<<1|1,T[i].bj);
		T[i].bj=0;
	}
}

void pushup(int i){
	REP(j,0,2)T[i].mn[j]=min(T[i<<1].mn[j],T[i<<1|1].mn[j]);
}

void build(int i,int l,int r){
	T[i].l=l;T[i].r=r;
	if(l==r){
		T[i].mn[0]=MAX;
		T[i].mn[1]=MAX-hs[l];
		T[i].mn[2]=MAX+hs[l];
		return;
	}
	int M=l+r>>1;
	build(i<<1,l,M);build(i<<1|1,M+1,r);
	pushup(i);
}

void update(int i,int x,ll y){
	if(T[i].l==T[i].r){
		T[i].mn[0]=min(T[i].mn[0],y);
		T[i].mn[1]=min(T[i].mn[1],y-hs[T[i].l]);
		T[i].mn[2]=min(T[i].mn[2],y+hs[T[i].l]);
		return;
	}
	int M=T[i].l+T[i].r>>1;
	pushdown(i);
	if(x<=M)update(i<<1,x,y);else update(i<<1|1,x,y);
	pushup(i);
}

ll query(int i,int l,int r,int t){
	if(l<=T[i].l&&T[i].r<=r)return T[i].mn[t];
	int M=T[i].l+T[i].r>>1;ll ans=MAX;
	pushdown(i);
	if(l<=M)ans=min(ans,query(i<<1,l,r,t));if(r>M)ans=min(ans,query(i<<1|1,l,r,t));
	return ans;
}

void Work(){
	build(1,1,cnt);
	update(1,lower_bound(hs+1,hs+cnt+1,A)-hs,abs(B-x[1]));
	update(1,lower_bound(hs+1,hs+cnt+1,B)-hs,abs(A-x[1]));
	REP(i,1,n)x[i]=LB(hs+1,hs+cnt+1,x[i])-hs;
	REP(i,2,n){
		ll t;
		t=min(hs[x[i]]+query(1,1,x[i],1),query(1,x[i],cnt,2)-hs[x[i]]);
		add(1,abs(hs[x[i]]-hs[x[i-1]]));
		update(1,x[i-1],t);
	}
	cout<<query(1,1,cnt,0)<<endl;
}

void Init(){
	read(n);
	read(n,A,B);
	REP(i,1,n)read(x[i]),hs[++cnt]=x[i];
	hs[++cnt]=A;hs[++cnt]=B;
	sort(hs+1,hs+cnt+1);cnt=unique(hs+1,hs+cnt+1)-hs-1;
}

int main(){
	Init();
	Work();
	return 0;
}


Measured memory_bytes: 14592