#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n;
struct Treap {
int lson, rson;
int val, pri;
int siz;
} tree[maxn];
int idcnt;
int root, num, ans;
inline void addNode(int &u, int val) {
u = ++idcnt;
tree[u].siz = 1;
tree[u].lson = tree[u].rson = 0;
tree[u].val = val;
tree[u].pri = rand();
}
inline void update(int u) {
tree[u].siz = tree[tree[u].lson].siz + 1 + tree[tree[u].rson].siz;
}
void rotate(int &u, int direct) {
int k;
if (direct == 1) {
k = tree[u].rson;
tree[u].rson = tree[k].lson;
tree[k].lson = u;
} else {
k = tree[u].lson;
tree[u].lson = tree[k].rson;
tree[k].rson = u;
}
tree[k].siz = tree[u].siz;
update(u);
u = k;
}
void insertNode(int &u, int val) {
if (u == 0) {
addNode(u, val);
return;
}
tree[u].siz++;
if (val >= tree[u].val) insertNode(tree[u].rson, val);
else insertNode(tree[u].lson, val);
if (tree[u].lson && tree[u].pri > tree[tree[u].lson].pri) rotate(u, 0);
if (tree[u].rson && tree[u].pri > tree[tree[u].rson].pri) rotate(u, 1);
update(u);
}
int getPre(int u, int val) {
if (u == 0) return 0;
if (tree[u].val >= val) return getPre(tree[u].lson, val);
int res = getPre(tree[u].rson, val);
if (res == 0) return tree[u].val;
return res;
}
int getSuf(int u, int val) {
if (u == 0) return 0;
if (tree[u].val <= val) return getSuf(tree[u].rson, val);
int res = getSuf(tree[u].lson, val);
if (res == 0) return tree[u].val;
return res;
}
int main() {
srand(time(NULL));
scanf("%d%d", &n, &num);
insertNode(root, num);
ans += num;
n--;
while (n--) {
scanf("%d", &num);
int pre = getPre(root, num);
int suf = getSuf(root, num);
ans += min(abs(num - pre), abs(suf - num));
insertNode(root, num);
}
printf("%d", ans);
return 0;
}