SBT:http://www.cnblogs.com/htfy/archive/2012/05/10/2495052.html
program calc;
Type
rec=record
fa,lch,rch,w:longint;
end;
Var
f:array[0..1000000] of rec;
n,i,ans,h,top,o:longint;
Procedure fopen;
begin
assign(input,'calc.in');
assign(output,'calc.out');
reset(input);
rewrite(output);
end;
Procedure fclose;
begin
close(input);
close(output);
end;
Function new:longint;inline;
begin
inc(top);
exit(top);
end;
Function Add(p,O:longint):longint;
begin
if h=0 then
begin
h:=new;
f[1].w:=o;
exit(1);
end;
if o<=f[p].w then
if f[p].lch<>0 then
exit(Add(f[p].lch,o))
else
begin
f[p].lch:=new;
f[f[p].lch].fa:=p;
f[f[p].lch].w:=o;
exit(f[p].lch);
end
else
if f[p].rch<>0 then
exit(Add(f[p].rch,o))
else
begin
f[p].rch:=new;
f[f[p].rch].w:=o;
f[f[p].rch].fa:=p;
exit(f[p].rch);
end;
end;
Procedure zig(P:longint);inline;
var
root:longint;
begin
root:=f[p].rch;
if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
f[root].fa:=f[p].fa;
f[p].rch:=f[root].lch;
f[f[p].rch].fa:=p;
f[root].lch:=p;
f[p].fa:=root;
end;
Procedure zag(P:longint);inline;
var
root:longint;
begin
root:=f[p].lch;
if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
f[root].fa:=f[p].fa;
f[p].lch:=f[root].rch;
f[f[p].lch].fa:=p;
f[root].rch:=p;
f[p].fa:=root;
end;
Procedure Splay(P:longint);
var
x,y,z:longint;
begin
x:=p;
y:=f[x].fa;
z:=f[y].fa;
while f[x].fa<>0 do
begin
y:=f[x].fa;
z:=f[y].fa;
if z=0 then
begin
if f[y].lch=x then zag(y) else zig(y);
exit;
end;
if (f[y].lch=x) and (f[z].lch=y) then
begin
zag(z);
zag(y);
end else
if (f[y].rch=x) and (f[z].rch=y) then
begin
zig(z);
zig(y);
end else
if (f[z].lch=y) and (f[y].rch=x) then
begin
zig(y);
zag(z);
end else
begin
zag(y);
zig(z);
end;
end;
end;
Function find(p,o:longint):longint;
begin
//writeln('i=',i,' p=',p,' o=',o);
if p=0 then exit(0);
if f[p].w=o then exit(o);
find:=maxlongint;
if o<=f[p].w then
if f[p].lch=0 then find:=f[p].w else find:=find(f[p].lch,o)
else
if f[p].rch=0 then find:=f[p].w else find:=find(f[p].rch,o);
if abs(f[p].w-o)<abs(find-o) then find:=f[p].w;
end;
begin
fopen;
readln(n);
top:=0;
for i:=1 to n do
begin
if not eof then readln(o) else o:=0;
// writeln(abs(find(h,o)-o));
inc(ans,abs(find(h,o)-o));
splay(Add(h,o));
end;
writeln(ans);
fclose;
end.