#include<bits/stdc++.h>
#define int long long
#define ls t[p].l
#define rs t[p].r
using namespace std;
const int inf=4e18;
const int N=1e6+25;
struct treap{
int l,r;
int cnt,siz;
int val,dat;
}t[N];
map<int,int>mp;
int tot,root,n,x;
inline void update(int &p){
t[p].siz=t[ls].siz+t[rs].siz+t[p].cnt;
}
inline void New(int val){
t[++tot].cnt=1;
t[tot].val=val;
t[tot].siz=1,t[tot].dat=rand();
update(tot);
}
inline void zig(int &p){
int q=t[p].l;
t[p].l=t[q].r,t[q].r=p,p=q;
update(rs),update(p);
}
inline void zag(int &p){
int q=t[p].r;
t[p].r=t[q].l,t[q].l=p,p=q;
update(ls),update(p);
}
inline void build(){
New(-inf),New(inf);
root=1;t[root].r=2;
update(root);
}
inline void Insert(int &p,int val){
if(!p){
New(val);
return;
}
if(val==t[p].val){
t[p].cnt++;
update(p);
return;
}
if(val<t[p].val){
Insert(ls,val);
if(t[p].dat<t[ls].dat)zig(p);
}else{
Insert(rs,val);
if(t[p].dat<t[rs].dat)zag(p);
}
update(p);
return;
}
inline int getpre(int val){
int p=root,ans=1;
while(p){
if(t[p].val==val){
if(t[p].l){
p=t[p].l;
while(t[p].r)p=t[p].r;
ans=p;
}
break;
}
if(t[p].val<val&&t[p].val>t[ans].val)ans=p;
p=val<t[p].val?t[p].l:t[p].r;
}
return t[ans].val;
}
inline int getnext(int val){
int p=root,ans=2;
while(p){
if(t[p].val==val){
if(t[p].r){
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;
p=val<t[p].val?t[p].l:t[p].r;
}
return t[ans].val;
}
int sum=0;
signed main(){
srand(time(0));
srand(rand());
cin>>n;
mp.clear();
for(int i=1;i<=n;i++){
cin>>x;
if(i==1){
Insert(root,x);
sum+=x;
mp[x]++;
}
if(i==2){
sum=sum+abs(sum-x);
Insert(root,x);
mp[x]++;
continue;
}
if(i>2){
if(mp[x]){
Insert(root,x);
continue;
}
int x1=getpre(x);
int x2=getnext(x);
mp[x]++;
sum+=min(abs(x1-x),abs(x2-x));
Insert(root,x);
}
}
cout<<sum;
return 0;
}