Pagini recente » Cod sursa (job #2094486) | Cod sursa (job #2092985) | Cod sursa (job #2547509) | Cod sursa (job #1721194) | Cod sursa (job #2096902)
#include<fstream>
using namespace std;
ifstream in ("interclasari.in");
ofstream out ("interclasari.out");
int sol,sz,n,x[21],y[21];
int v[21][1000000];
struct str {
int val,clasa;
}heap[101];
void up (int p) {
while (p>1 && heap[p].val < heap[p/2].val) {
swap (heap[p],heap[p/2]);
p /= 2;
}
return;
}
void down (int p) {
while (p*2 <= sz) {
int t = p * 2;
if (t < sz && heap[t].val > heap[t+1].val) {
t ++;
}
if (heap[t].val < heap[p].val) {
swap (heap[t], heap[p]);
p = t;
}
else {
break;
}
}
return;
}
void adauga (int valoare, int cls) {
sz++;
heap[sz].val = valoare;
heap[sz].clasa = cls;
up (sz);
return;
}
void elimina () {
swap (heap[1],heap[sz]);
heap[sz].val = 0;
heap[sz].clasa = 0;
sz --;
down (1);
}
int valoare, grupa;
int main (void) {
in >> n;
for (int i = 1; i <= n; i ++) {
in >> x[i];
sol += x[i];
for (int j = 1; j <= x[i]; j ++) {
in >> v[i][j];
}
y[i] = 1;
}
for (int i = 1; i <= n; i ++) {
if (y[i] <= x[i]) {
adauga (v[i][y[i]],i);
}
}
out << sol <<"\n";
while (sz > 0) {
valoare = heap[1].val;
grupa = heap[1].clasa;
elimina();
y[grupa] ++;
if (y[grupa] <= x[grupa]) {
adauga (v[grupa][y[grupa]],grupa);
}
out << valoare <<" ";
}
return 0;
}