Cod sursa(job #1621965)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 29 februarie 2016 23:36:39
Problema Heapuri Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#define lim 200000
int v[lim],poz[lim],heap[lim],n;
inline int dad(int p){
    return (p-1)/2;
}
inline int sonst(int p){
    return 2*p+1;
}
inline int sondr(int p){
    return 2*p+2;
}
inline void swap(int p,int q){
    int aux;
    aux=heap[p];
    heap[p]=heap[q];
    heap[q]=aux;
    poz[heap[p]]=p;
    poz[heap[q]]=q;
}
inline void up(int p){
    while(p>0&&v[heap[dad(p)]]>v[heap[p]]){
        swap(p,dad(p));
        p=dad(p);
    }
}
inline void insert(int i){
    heap[n]=i;
    poz[i]=n;
    n++;
    up(n-1);
}
inline void down(int p){
    int q,pp=1;
    while(pp!=0&&sonst(p)<n){
        q=sonst(p);
        if(sondr(p)<n&&v[heap[sondr(p)]]<v[heap[q]])
            q=sondr(p);
        if(v[heap[q]]<v[heap[p]]){
            swap(p,q);
            p=q;
        }
        else
            pp=0;
    }
}
inline void erase(int p){
    n--;
    swap(n,p);
    if(p!=0&&v[heap[p]]<v[heap[dad(p)]])
        up(p);
    else
        down(p);
}
int main(){
    FILE *fin,*fout;
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");
    int i,x,op,cer;
    fscanf(fin,"%d",&op);
    for(i=0;i<op;i++){
        fscanf(fin,"%d",&cer);
        if(cer==1){
            fscanf(fin,"%d",&v[i]);
            insert(i);
        }
        if(cer==2){
            fscanf(fin,"%d",&x);
            erase(poz[x-1]);
        }
        if(cer==3)
            fprintf(fout,"%d\n",v[heap[0]]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}