Cod sursa(job #673124)
#include <fstream>
#define NMAx 1000100
#define oo 1LL*(1<<30)
using namespace std;
struct arbore{int fiu[2];
long long frecv;
}nod[2*NMAx];
int n,nr,LG[NMAx],Q[2][NMAx],L[2],R[2];
long long sol,B[NMAx];
void dfs(int i,long long config,int nivel) {
if(nod[i].fiu[0]) {
dfs(nod[i].fiu[0],(config<<1),nivel+1);
dfs(nod[i].fiu[1],(config<<1)+1,nivel+1);
return;
}
B[i]=config;
LG[i]=nivel;
}
void pop(int &x) {
if(nod[Q[0][L[0]]].frecv<nod[Q[1][L[1]]].frecv)
x=Q[0][L[0]++];
else
x=Q[1][L[1]++];
}
void citire() {
int i;
ifstream in("huffman.in");
in>>n;
for(i=1;i<=n;i++) {
in>>nod[i].frecv;
Q[0][i]=i;
}
in.close();
}
void afis() {
int i;
freopen("huffman.out","w",stdout);
printf("%lld\n",sol);
for(i=1;i<=n;i++)
printf("%d %lld\n",LG[i],B[i]);
}
int main() {
int a,b;
citire();
L[0]=L[1]=1;
R[0]=n;
R[1]=0;
nr=n;
nod[0].frecv=oo*oo;
while(L[0]<=R[0]||L[1]<R[1]) {
pop(a);
pop(b);
++nr;
nod[nr].fiu[0]=a;
nod[nr].fiu[1]=b;
nod[nr].frecv=nod[a].frecv+nod[b].frecv;
sol+=nod[nr].frecv;
Q[1][++R[1]]=nr;
}
dfs(nr,0,0);
afis();
return 0;
}