//OOOOOOOOOOOOOOOOrz
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
int num=0,sign=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
while (ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
return num*sign;
}
const int N=32770,INF=0x3f3f3f3f;
struct Treap{
int ls,rs,siz,val,key;
}t[N];
int root,node;
void pushup(int id){
t[id].siz=t[t[id].ls].siz+t[t[id].rs].siz+1;
}
void split(int now,int val,int &x,int &y){
if(!now) return x=y=0,void();
if(t[now].val<=val) x=now,split(t[now].rs,val,t[now].rs,y);
else y=now,split(t[now].ls,val,x,t[now].ls);
pushup(now);
}
int merge(int x,int y){
if(!x||!y) return x^y;
if(t[x].key>t[y].key){
t[x].rs=merge(t[x].rs,y);
pushup(x);
return x;
}
else{
t[y].ls=merge(x,t[y].ls);
pushup(y);
return y;
}
}
int x,y;
int new_node(int val){
t[++node]={0,0,1,val,rand()};
return node;
}
void insert(int val){
split(root,val,x,y);
root=merge(merge(x,new_node(val)),y);
}
int nlt(int val){
split(root,val-1,x,y);
int ans=t[x].siz+1;
root=merge(x,y);
return ans;
}
int kth(int id,int k){
if(t[t[id].ls].siz+1==k) return t[id].val;
if(t[t[id].ls].siz>=k) return kth(t[id].ls,k);
return kth(t[id].rs,k-t[t[id].ls].siz-1);
}
void query(int val,int &a,int &b,int &c){
a=kth(root,nlt(val-1));b=kth(root,nlt(val));c=kth(root,nlt(val+1));
}
int main(){
srand((unsigned)time(NULL));
int n=rd(),ans;
insert(INF);insert(-INF);
for(int i=1;i<=n;i++){
int x=rd();
if(i==1) ans=x;
else{
int a,b,c;
query(x,a,b,c);
ans+=min(min(abs(x-a),abs(x-b)),abs(x-c));
}
insert(x);
}
cout<<ans<<endl;
return 0;
}
快来把可恶的WA绳之以法!!!