Cod sursa(job #1238126)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 5 octombrie 2014 18:27:45
Problema Heapuri Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.87 kb
//v[i]=valoarea elementului intrat al i-lea in multime
//heap[i]=al catelea element intrat in multime este cel de pe pozitia i in heap
//poz[i]=pozitia in heap a elementului intrat al i-lea in multime
#include <stdio.h>
#define MAXN 200000
int n, heap[MAXN], v[MAXN], poz[MAXN];
inline int fiudr(int a){
    return (a*2)+2;
}
inline int fiust(int a){
    return (a*2)+1;
}
inline int tata(int a){
    return (a-1)/2;
}
inline void swap(int p1, int p2){
    int aux;
    poz[heap[p1]]=p2;
    poz[heap[p2]]=p1;
    aux=heap[p1];
    heap[p1]=heap[p2];
    heap[p2]=aux;
}
inline void urcare(int p){
    while((p!=0)&&(v[heap[p]]<v[heap[tata(p)]])){
        swap(p, tata(p));
        p=tata(p);
    }
}
inline void coborare(int p){
    while(((fiust(p)<n)&&(v[heap[fiust(p)]]<v[heap[p]]))||((fiudr(p)<n)&&(v[heap[fiudr(p)]]<v[heap[p]]))){
        if((fiust(p)<n)&&(v[heap[fiust(p)]]<v[heap[p]])){
            swap(fiust(p), p);
            p=fiust(p);
        }else{
            swap(fiudr(p), p);
            p=fiudr(p);
        }
    }
}
inline void elimina(int p){
    n--;
    heap[poz[p]]=heap[n];
    poz[heap[n]]=poz[p];
    if(poz[p]<n){
        coborare(poz[p]);
    }
}
inline void adauga(int p){
    heap[n]=p;
    poz[p]=n;
    n++;
    urcare(poz[p]);
}
int main(){
    int t, i, q, x, k;
    FILE *fin, *fout;
    fin=fopen("heapuri.in" ,"r");
    fout=fopen("heapuri.out", "w");
    fscanf(fin, "%d", &t);
    n=0;
    k=0;
    for(i=0; i<t; i++){
        fscanf(fin, "%d", &q);
        if(q==3){
            fprintf(fout, "%d\n", v[heap[0]]);
        }else{
            fscanf(fin, "%d", &x);
            if(q==2){
                elimina(x-1);
            }else{
                v[k]=x;
                adauga(k);
                k++;
            }
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}