#include <cstdio>
#include <algorithm>
int N, Q, A, last;
long long tag[524288], as[524288], ds[524288];
inline void down(int p)
{
if (tag[p])
{
as[p << 1] += tag[p];
ds[p << 1] += tag[p];
tag[p << 1] += tag[p];
as[p << 1 | 1] += tag[p];
ds[p << 1 | 1] += tag[p];
tag[p << 1 | 1] += tag[p];
tag[p] = 0;
}
}
inline void up(int p)
{
as[p] = std::min(as[p << 1], as[p << 1 | 1]);
ds[p] = std::min(ds[p << 1], ds[p << 1 | 1]);
}
void build(int p, int l, int r)
{
if (l == r)
{
long long w = l == A ? 0 : 1LL << 60;
as[p] = w + l;
ds[p] = w - l;
return;
}
int m = l + r >> 1;
build(p << 1, l, m);
build(p << 1 | 1, m + 1, r);
as[p] = std::min(as[p << 1], as[p << 1 | 1]);
ds[p] = std::min(ds[p << 1], ds[p << 1 | 1]);
}
inline int abs(int x)
{
return x < 0 ? -x : x;
}
long long G(int p, int l, int r, int L, int R, long long *s)
{
if (L <= l && r <= R)
return s[p];
int m = l + r >> 1;
down(p);
if (R <= m)
return G(p << 1, l, m, L, R, s);
if (L > m)
return G(p << 1 | 1, m + 1, r, L, R, s);
return std::min(G(p << 1, l, m, L, R, s), G(p << 1 | 1, m + 1, r, L, R, s));
}
void DFS(int p, int l, int r, long long &O)
{
if (l == r)
{
O = std::min(O, ds[p] + l);
return;
}
int m = l + r >> 1;
down(p);
DFS(p << 1, l, m, O);
DFS(p << 1 | 1, m + 1, r, O);
}
int main()
{
scanf("%d%d%d%d", &N, &Q, &A, &last);
build(1, 1, N);
for (int i = 1, x; i <= Q; i++)
{
scanf("%d", &x);
long long ILoveYou = std::min(G(1, 1, N, 1, x, ds) + x, G(1, 1, N, x, N, as) - x);
tag[1] += abs(last - x);
int p = 1, l = 1, r = N;
while (l < r)
{
int m = l + r >> 1;
down(p);
if (last <= m)
p <<= 1, r = m;
else
p = p << 1 | 1, l = m + 1;
}
as[p] = ILoveYou + last;
ds[p] = ILoveYou - last;
while (p >>= 1)
up(p);
last = x;
}
long long O = 1LL << 60;
DFS(1, 1, N, O);
printf("%lld\n", O);
return 0;
}