Cod sursa(job #1418964)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 14 aprilie 2015 14:51:04
Problema Interclasari Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
#define DIM 30000002

using namespace std;

ifstream fin("interclasari.in");
ofstream fout("interclasari.out");

int K,N;
int H[DIM];
vector <int> v[21];
int a[21];
int n;
int ans;
void upheap(int x){
    int c=x;
    int p=c/2;
    while(p>=1 && H[p]>H[c]){
        swap(H[c],H[p]);
        c=p;
        p/=2;
    }
}
void downheap(int x){
    int p=x;
    int c=2*p;
    while(c<=n){
        if(c+1<=n && H[c]>H[c+1])
            c++;
        if(H[p]>H[c]){
            swap(H[p],H[c]);
            p=c;
            c*=2;
        }
        else
            break;
    }
}
void insert(int x){
    H[++n]=x;
    upheap(n);
}
void erase(){
    H[1]=H[n];
    n--;
    downheap(1);
}
int main(){
    fin>>K;
    for(int i=1;i<=K;i++){
        fin>>a[i];
        ans+=a[i];
        v[i].push_back(1);
        for(int j=1;j<=a[i];j++){
            int x;
            fin>>x;
            v[i].push_back(x);
        }
    }
    fout<<ans<<"\n";
    if(ans!=0)
    while(1){
        int ok=0;
        for(int i=1;i<=K;i++)
            if(v[i][0]<=a[i])
                insert(v[i][v[i][0]++]),ok=1;
        fout<<H[1]<<" ";
        erase();
        if(!ok)
            break;
    }
    while(n!=0){
        fout<<H[1]<<" ";
        erase();
    }
    fin.close();fout.close();
    return 0;
}