//#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
#define rep(i, n) for(int i=0; i<n; ++i)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
using ll = int64_t;
using ld = long double;
using P = pair<int, int>;
using vs = vector<string>;
using vi = vector<int>;
using vvi = vector<vi>;
template<class T> using PQ = priority_queue<T>;
template<class T> using PQG = priority_queue<T, vector<T>, greater<T> >;
const int INF = 100010001;
const ll LINF = (ll)INF*INF*10;
template<typename T1, typename T2>
inline bool chmax(T1 &a, T2 b) {return a < b && (a = b, true);}
template<typename T1, typename T2>
inline bool chmin(T1 &a, T2 b) {return a > b && (a = b, true);}
template<typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) { return is >> p.first >> p.second;}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) { return os << p.first << ' ' << p.second;}


template<class T>
struct RMQ {
  T INF;
  int n;
  vector<T> dat, laz;
  RMQ(int n_) {
    INF = numeric_limits<T>::max()/10;
    n = 1;
    while(n < n_) n <<= 1;
    dat.assign(2*n-1, INF);
    laz.assign(2*n-1, 0);
  }
  inline int chld(int k) {return k*2+1;}
  inline int chrd(int k) {return k*2+2;}
  void eval(int k) {
    if(!laz[k]) return;
    if(k < n-1) {
      laz[chld(k)] += laz[k];
      laz[chrd(k)] += laz[k];
    }
    dat[k] += laz[k];
    laz[k] = 0;
  }
  void update(int a, int b, T x, int k, int l, int r) {
    eval(k);
    if(a <= l and r <= b) {
      laz[k] += x;
      eval(k);
    } else if(a < r and l < b) {
      update(a, b, x, chld(k), l, (l+r)>>1);
      update(a, b, x, chrd(k), (l+r)>>1, r);
      dat[k] = min(dat[chld(k)], dat[chrd(k)]);
    }
  }
  inline void update(int a, int b, T x) {update(a, b, x, 0, 0, n);}
  void eval_(int i, int k, int l, int r) {
    eval(k);
    if(r-l == 1) {
      return;
    }
    int half = (l+r)>>1;
    if(i < half) {
      eval_(i, chld(k), l, half);
    } else {
      eval_(i, chrd(k), half, r);
    }
  }
  void update(int i, T x) {
    eval_(i, 0, 0, n);
    int h = i+n-1;
    chmin(dat[h], x);
    while(h) {
      h = (h-1)>>1;
      chmin(dat[h], x);
    }
  }
  T query(int a, int b, int k, int l, int r) {
    eval(k);
    if(r <= a or b <= l) return INF;
    if(a <= l and r <= b) return dat[k];
    return min(query(a, b, chld(k), l, (l+r)>>1), query(a, b, chrd(k), (l+r)>>1, r));
  }
  inline T query(int a, int b) {return query(a, b, 0, 0, n);}
};

//head



int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, q, a, b;
  cin >> n >> q >> a >> b;
  int pre, x;
  cin >> pre;
  RMQ<ll> rng1(n), rng2(n);
  rng1.update(a-1, a-1+abs(b-pre));
  rng1.update(b-1, b-1+abs(a-pre));
  rng2.update(a-1, n-a+abs(b-pre));
  rng2.update(b-1, n-b+abs(a-pre));
  pre--;
  while(--q) {
    cin >> x;
    x--;
    ll mi = rng1.query(x, n)-x;
    chmin(mi, rng2.query(0, x+1)-(n-x-1));
    rng1.update(0, n, abs(x-pre));
    rng2.update(0, n, abs(x-pre));
    rng1.update(pre, mi+pre);
    rng2.update(pre, mi+n-pre-1);
    pre = x;
  }
  ll mi = LINF;
  rep(i, n) {
    chmin(mi, rng1.query(i, i+1)-i);
  }
  cout << mi << endl;
}

Measured memory_bytes: 19556