Cod sursa(job #1443319)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 27 mai 2015 17:11:34
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.87 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 200001
FILE*fi,*fout;
typedef int Heap[MAXN];
Heap H;
int v[MAXN],vf[MAXN],nr,m;
inline int l_son(int nod){
    return 2*nod;
}
inline int r_son(int nod){
    return 2*nod+1;
}
inline int father(int nod){
    return nod/2;
}
inline void coborare(int nod){
    int k,aux;
    while(nod){
        k=nod;
        if(l_son(k)<=nr&&v[H[l_son(k)]]<v[H[k]])
               nod=l_son(k);
        if(r_son(k)<=nr&&v[H[r_son(k)]]<v[H[nod]])
               nod=r_son(k);
        if(k==nod)
            nod=0;
        else{
            aux=vf[H[k]];
            vf[H[k]]=nod;
            vf[H[nod]]=aux;
            aux=H[nod];
            H[nod]=H[k];
            H[k]=aux;
        }
    }
}
inline void urcare(int nod){
    int k,aux;
    while(nod){
        k=nod;
        if(father(nod)>0){
            if(v[H[nod]]<v[H[father(nod)]])
                nod=father(nod);
            aux=vf[H[k]];
            vf[H[k]]=nod;
            vf[H[nod]]=aux;
            aux=H[nod];
            H[nod]=H[k];
            H[k]=aux;
        }
        if(k==nod)
             nod=0;
    }
}
inline void elimina(int nod){
     vf[H[nod]]=-1;
     H[nod]=H[nr];
     vf[H[nr]]=nod;
     nr--;
     coborare(nod);
     urcare(nod);
}
int main(){
    int i,n,t,x,j;
    fi=fopen("heapuri.in" ,"r");
    fout=fopen("heapuri.out" ,"w");
    fscanf(fi,"%d" ,&n);
    nr=m=0;
    for(i=0;i<n;i++){
        fscanf(fi,"%d" ,&t);
        if(t==1){
            nr++;
            m++;
            fscanf(fi,"%d" ,&v[m]);
            H[nr]=m;
            vf[H[nr]]=nr;
            urcare(nr);
        }
        if(t==2){
            fscanf(fi,"%d" ,&x);
            elimina(vf[x]);
        }
        if(t==3)
            fprintf(fout,"%d\n" ,v[H[1]]);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}