Cod sursa(job #474157)
#include<fstream>
#include<queue>
using namespace std;
#define NMAX 1000003
#define ll long long
ifstream fi("huffman.in");
struct Nod {
ll v;
int f[2];
} nod[NMAX<<1];
queue<int> q;
int n,i,id,nod1,nod2;
int lg[NMAX];
ll cod[NMAX];
ll lgtot;
int nodMin() {
int rez;
if(q.empty()) return id++;
rez=q.front();
if(id==n) {
q.pop();
return rez;
}
if(nod[id].v<nod[rez].v) return id++;
q.pop();
return rez;
}
void uneste(int nod1, int nod2, int nodRez) {
nod[nodRez].f[0]=nod1;
nod[nodRez].f[1]=nod2;
nod[nodRez].v=nod[nod1].v+nod[nod2].v;
q.push(nodRez);
}
void asociazaCod(int nrnod,ll nrcod,int lung) {
if(nrnod>=n) {
lgtot+=nod[nrnod].v;
asociazaCod(nod[nrnod].f[0],nrcod<<1,lung+1);
asociazaCod(nod[nrnod].f[1],1+(nrcod<<1),lung+1);
return;
}
cod[nrnod]=nrcod;
lg[nrnod]=lung;
}
int main() {
fi>>n;
for(i=0;i<n;i++) fi>>nod[i].v;
for(i=n;i<=2*n-2;i++) {
nod1=nodMin();
nod2=nodMin();
uneste(nod1,nod2,i);
}
asociazaCod(2*n-2,0,0);
freopen("huffman.out","w",stdout);
printf("%lld\n",lgtot);
for(i=0;i<n;i++) printf("%d %lld\n",lg[i],cod[i]);
return 0;
}