Pagini recente » Profil ApostolIlieDaniel | Profil NOSCOPEPROKENDY | Diferente pentru utilizator/blacknesta intre reviziile 88 si 93 | Profil Daniel_Mocsi | Cod sursa (job #721353)
Cod sursa(job #721353)
var v,st,dr,l:array[0..1000005] of longint;
v2,rez,b:array[0..1000005] of int64;
min:array[1..2] of longint;
n,i,j,k1,k2,aux:longint;
f,g:text;
procedure rec(nod,lev:longint;nr:int64);
begin
if nod<=n then
begin
l[nod]:=lev;
b[nod]:=nr;
end
else
begin
rec(st[nod-n],lev+1,nr shl 1);
rec(dr[nod-n],lev+1,(nr shl 1) or 1);
end;
end;
begin
assign(f,'huffman.in');
assign(g,'huffman.out');
reset(f);rewrite(g);
read(f,n);
for i:=1 to n do
read(f,v[i]);
k1:=1;
k2:=1;
for i:=1 to n-1 do
begin
for j:=1 to 2 do
if (k1<=n) and (k2<=i-1) then
if v[k1]<v2[k2] then
begin
min[j]:=k1;
inc(k1);
end
else
begin
min[j]:=k2+n;
inc(k2);
end
else
if k1<=n then
begin
min[j]:=k1;
inc(k1);
end
else
begin
min[j]:=k2+n;
inc(k2);
end;
if min[1]<=n then
v2[i]:=v[min[1]]
else
begin
v2[i]:=v2[min[1]-n];
rez[i]:=rez[min[1]-n];
end;
if min[2]<=n then
v2[i]:=v2[i]+v[min[2]]
else
begin
v2[i]:=v2[i]+v2[min[2]-n];
rez[i]:=rez[i]+rez[min[2]-n];
end;
rez[i]:=rez[i]+v2[i];
st[i]:=min[1];
dr[i]:=min[2];
end;
rec((n shl 1)-1,0,0);
writeln(g,rez[n-1]);
for i:=1 to n do
writeln(g,l[i],' ',b[i]);
close(f);close(g);
end.