Cod sursa(job #2096902)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 30 decembrie 2017 00:32:21
Problema Interclasari Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#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;
}