Pagini recente » Cod sursa (job #1933133) | Cod sursa (job #2757627) | Cod sursa (job #2974799) | Cod sursa (job #869851) | Cod sursa (job #2906752)
#include <bits/stdc++.h>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
const int CMAX = 2e6+15;;
int n;
long long temp;
struct noduri{
int st, dr , niv;
long long val;
}heap[CMAX];
void read(){
f >> n;
for(int i=1;i<=n;i++)
f >> heap[i].val;
}
void parc_srd(int nod,int niv, long long val){
if(nod>0){
heap[nod].val = val;
heap[nod].niv = niv;
parc_srd(heap[nod].st,niv+1,val*2);
parc_srd(heap[nod].dr,niv+1,(val*2)+1);
}
}
void huffman(){
heap[n+1].val = LONG_LONG_MAX;
int i, j, stop , st , dr;
i = 1;
j = n+2;
stop = n+1;
while(i < n+1 || j < stop){
if(j <= stop && heap[j].val < heap[i].val)
st = j++;
else{
st = i++;
}
if(j < stop && heap[j].val < heap[i].val){
dr = j++;
}
else
{
dr = i++;
}
heap[++stop].val = heap[st].val + heap[dr].val;
heap[stop].st = st;
heap[stop].dr = dr;
temp = temp + heap[stop].val;
}
parc_srd(stop,0,0);
}
int main()
{
read();
huffman();
g << temp << '\n';
for(int i=1;i<=n;i++)
g << heap[i].niv << " " << heap[i].val << '\n';
return 0;
}