#include<bits/stdc++.h>
using namespace std;
const int N=2e5+25;
struct FHQtreap{
struct node{
int val,siz;
int lson,rson;
int pri;
}treap[N];
int usize,root;
inline void update(int u){
treap[u].siz=treap[treap[u].lson].siz+treap[treap[u].rson].siz+1;
}
inline void split(int u,int x,int &L,int &R){
if(!u){L=R=0;return;}
if(treap[u].val<=x)L=u,split(treap[u].rson,x,treap[u].rson,R);
else R=u,split(treap[u].lson,x,L,treap[u].lson);
update(u);
return;
}
inline int merge(int a,int b){
if(!a||!b)return a+b;
if(treap[a].pri>treap[b].pri){
treap[a].rson=merge(treap[a].rson,b);
update(a);
return a;
}else{
treap[b].lson=merge(a,treap[b].lson);
update(b);
return b;
}
}
inline void mknew(int x){
++usize;
treap[usize].val=x;
treap[usize].pri=rand();
treap[usize].siz=1;
}
inline void insert(int x){
int L,R;
split(root,x,L,R);
mknew(x);
root=merge(merge(L,usize),R);
}
inline int kth(int u,int rnk){
if(rnk==treap[treap[u].lson].siz+1)return u;
if(treap[treap[u].lson].siz>=rnk)return kth(treap[u].lson,rnk);
else return kth(treap[u].rson,rnk-treap[treap[u].lson].siz-1);
}
inline int getpre(int x){
int L,R;
split(root,x-1,L,R);
int res=treap[kth(L,treap[L].siz)].val;
root=merge(L,R);
return res;
}
inline int getnext(int x){
int L,R;
split(root,x,L,R);
int res=treap[kth(R,1)].val;
root=merge(L,R);
return res;
}
}t;
int n,x,ans;
int main(){
srand(time(0));
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
if(i==1){ans+=x;t.insert(x);}
else {
int p1=t.getnext(x);
int p2=t.getpre(x);
ans+=min(abs(p1-x),abs(p2-x));
t.insert(x);
}
}
cout<<ans;
}