Pagini recente » Cod sursa (job #3272351) | Cod sursa (job #3121532) | Cod sursa (job #2374191) | Cod sursa (job #1237926) | Cod sursa (job #1148006)
#include <cstdio>
using namespace std;
int n,q1[1000001],q2[1000001],q1s=1,q1e,q2s=1,q2e,nr,l[1000001],fiu[2000001][2];
long long v[2000001],c[1000001],lt;
inline void qget(int &x)
{
if(q1s>q1e)
x=q2[q2s++];
else if(q2s>q2e)
x=q1[q1s++];
else if(v[q1[q1s]]<v[q2[q2s]])
x=q1[q1s++];
else
x=q2[q2s++];
}
void dfs(int nod,int lev,long long conf)
{
if(fiu[nod][0])
{
dfs(fiu[nod][0],lev+1,conf<<1);
dfs(fiu[nod][1],lev+1,(conf<<1)+1);
}
else
{
l[nod]=lev;
c[nod]=conf;
lt+=lev*v[nod];
}
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
nr=n;
while(q1e<n)
{
++q1e;
q1[q1e]=q1e;
scanf("%lld",v+q1e);
}
while(q1e-q1s+q2e-q2s>=0)
{
int a,b;
qget(a);
qget(b);
q2[++q2e]=++nr;
v[nr]=v[a]+v[b];
fiu[nr][0]=a;
fiu[nr][1]=b;
}
dfs(nr,0,0);
printf("%lld\n",lt);
for(int i=1;i<=n;++i)
printf("%d %lld\n",l[i],c[i]);
return 0;
}