#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define int long long
struct node{
int l,r;
int val;
int ran;
}t[57257];
int tot,root,inf=114514114514;
int _(int val){
t[++tot].val=val;
t[tot].ran=rand();
return tot;
}
void build(){
tot=0;
_(-inf),_(inf);
root=1;
t[1].r=2;
}
bool find(int p,int val){
if (p==0) return 0;
if (t[p].val==val) return 1;
if (t[p].val<val) return find(t[p].r,val);
else return find(t[p].l,val);
}
void zig(int &p){
int q=t[p].l;
t[p].l=t[q].r;
t[q].r=p;
p=q;
}
void zag(int &p){
int q=t[p].r;
t[p].r=t[q].l;
t[q].l=p;
p=q;
}
void insert(int &p,int val){
if (p==0){
p=_(val);
return ;
}
if (val==t[p].val) return ;
if (t[p].val<val){
insert(t[p].r,val);
if (t[p].ran<t[t[p].r].ran) zag(p);
}
else{
insert(t[p].l,val);
if (t[p].ran<t[t[p].l].ran) zig(p);
}
}
int pre(int val){
int ans=1;
int p=root;
while (p){
if (val==t[p].val){
if (t[p].l>0){
p=t[p].l;
while (t[p].r>0) p=t[p].r;
ans=p;
}
break;
}
if (t[p].val<val&&t[p].val>t[ans].val) ans=p;
if (t[p].val<val) p=t[p].r;
else p=t[p].l;
}
return t[ans].val;
}
int next(int val){
int ans=2;
int p=root;
while (p){
if (val==t[p].val){
if (t[p].r>0){
p=t[p].r;
while (t[p].l>0) p=t[p].l;
ans=p;
}
break;
}
if (t[p].val>val&&t[p].val<t[ans].val) ans=p;
if (t[p].val<val) p=t[p].r;
else p=t[p].l;
}
return t[ans].val;
}
signed main(){
build();
int n,ans=0;
scanf("%lld",&n);
int x;
scanf("%lld",&x);
ans=x;
insert(root,x);
for (int i=2;i<=n;i++){
scanf("%lld",&x);
if (find(root,x));
else{
ans+=min(abs(x-pre(x)),next(x)-x);
}
insert(root,x);
}
printf("%lld\n",ans);
return 0;
}