#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read(){
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
// find a pre and a last in bst
//nlongn for every n is o(n) and find a best close is o(longn) by using bst
struct data{
int c;//union
int size;
int w;//rand
int lc,rc;
int v;
}t[1000001];
int root,k,js;
void treap_r(int &k){
int son1=t[k].lc; int son2=t[son1].rc;
t[k].lc=son2; t[son1].rc=k;
t[son1].size=t[k].size; t[k].size=t[t[k].rc].size+t[son2].size+t[k].c;
k=son1;
}
void treap_l(int &k){
int son1=t[k].rc; int son2=t[son1].lc;
t[k].rc=son2; t[son1].lc=k;
t[son1].size=t[k].size; t[k].size=t[t[k].lc].size+t[son2].size+t[k].c;
k=son1;
}
void insert(int &k,int n){
if(!k){
k=++js; t[k].lc=t[k].rc=0; t[k].c=t[k].size=1;
t[k].w=rand(); t[k].v=n; return ;
}
if(t[k].v==n){
t[k].c++; return;
}
if(t[k].v>n){
t[k].size++; insert(t[k].lc,n);
if(t[t[k].lc].w<t[k].w) treap_l(k);
}
if(t[k].v<n){
t[k].size++; insert(t[k].rc,n);
if(t[t[k].rc].size<t[k].w) treap_r(k);
}
}
int find_close_max(const int vi){
int best=root,sc;
while(best){
if(t[best].v==vi){ return vi; }
if(t[best].v>vi){
best=t[best].lc; sc=t[best].v;
}
if(t[best].v<vi){ t[best].rc; }
}
return sc;
}
int find_close_min(const int vi){
int best=root,pr;
while(best){
if(t[best].v<vi){
best=t[best].rc; pr=t[best].rc;
}
if(t[best].v==vi){ return vi; }
if(t[best].v>vi){ best=t[best].lc; }
}
return pr;
}
int main()
{
long long ans=0;
int n=read();
for(int i=1;i<=n;i++){
int s=read();
if(i==1){
ans+=s; insert(root,s); continue;
}
ans+=min(abs(s-find_close_max(s)),abs(s-find_close_min(s)));
insert(root,s);
}
cout<<ans;
return 0;
}