Cod sursa(job #1261816)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 12 noiembrie 2014 18:37:46
Problema Interclasari Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#define MAXN 4000000
int v[MAXN], n;
inline int tata(int a){
    return (a-1)/2;
}
inline int fiust(int a){
    return a*2+1;
}
inline int fiudr(int a){
    return a*2+2;
}
inline void swap(int a, int b){
    int aux=v[a];
    v[a]=v[b];
    v[b]=aux;
}
inline void coborare(int p){
    int f, q;
    f=1;
    while((f==1)&&(fiust(p)<n)){
        q=fiust(p);
        if((fiudr(p)<n)&&(v[q]>=v[fiudr(p)])){
            q=fiudr(p);
        }
        if(v[q]<v[p]){
            swap(p, q);
            p=q;
        }else{
            f=0;
        }
    }
}
inline void urcare(int p){
    while((p!=0)&&(v[p]<v[tata(p)])){
        swap(p, tata(p));
        p=tata(p);
    }
}
inline void adauga(int x){
    v[n]=x;
    n++;
    urcare(n-1);
}
inline void sterge(int p){
    n--;
    v[0]=v[n];
    coborare(0);
}
int main(){
    int k, a, i, j, x;
    FILE *fin, *fout;
    fin=fopen("interclasari.in", "r");
    fout=fopen("interclasari.out", "w");
    fscanf(fin, "%d", &k);
    for(i=0; i<k; i++){
        fscanf(fin, "%d", &a);
        for(j=0; j<a; j++){
            fscanf(fin, "%d", &x);
            adauga(x);
        }
    }
    fprintf(fout, "%d\n", n);
    while(n>1){
        fprintf(fout, "%d ", v[0]);
        sterge(0);
    }
    if(n==1){
        fprintf(fout, "%d\n", v[0]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}