#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e7+10;
const int N=1e5*5+10;
int n,Ans,rt,k,x,y;
inline int read(){
int ss=0,tt=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='=') tt*=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
ss=ss*10+(c-'0');
c=getchar();
}
return ss*tt;
}
struct node{
int l,r,p,v;
#define lc(x) t[x].l
#define rc(x) t[x].r
#define p(x) t[x].p
#define vis(x) t[x].v
}t[N];
int T;
inline void Zig(int &x){
int y=lc(x);
lc(x)=rc(y),rc(y)=x;
x=y;
}
inline void Zag(int &x){
int y=rc(x);
rc(x)=lc(y),lc(y)=x;
x=y;
}
inline void Insert(int &x,const int vi){
if(!x){
vis(x=++T)=vi,p(x)=rand();
return;
}
if(vi<vis(x)){
Insert(lc(x),vi);
if(p(lc(x))<p(x)) Zig(x);
}else{
Insert(rc(x),vi);
if(p(rc(x))<p(x)) Zag(x);
}
}
inline int QueryPre(const int vi){
int x=rt,pr=-Maxn;
while(x){
if(vi>=vis(x)) pr=vis(x),x=rc(x);
else x=lc(x);
}
return pr;
}
inline int QuerySuf(const int vi){
int x=rt,sf=Maxn;
while(x){
if(vi<=vis(x)) sf=vis(x),x=lc(x);
else x=rc(x);
}
return sf;
}
int main(){
n=read();
Ans=read();Insert(rt,Ans);
for(int i=2;i<=n;i++){
k=read();
x=QueryPre(k),y=QuerySuf(k);
//cout<<x<<" "<<y<<endl;
Ans+=min(k-x,y-k);
//cout<<Ans<<endl;
Insert(rt,k);
}
cout<<Ans<<endl;
return 0;
}