Cod sursa(job #879551)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 15 februarie 2013 16:52:25
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#define dim 200007
using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");
int pos[dim],h[3*dim],N,i,op,a[dim],n,x,cnt;
inline int rs(int nod){
    return 2*nod+1;
}
inline int ls(int nod){
    return 2*nod;
}
void urca(int k){

    while( k>1 && a[h[k/2]]>a[h[k]]){
        swap(pos[h[k]],pos[h[k/2]]);
        swap(h[k],h[k/2]);
        k/=2;
    }
}
void coboara( int nod){

    int fiu=nod;



    if(ls(nod)<=N && a[h[fiu]]>a[h[ls(nod)]] ){
        fiu=ls(nod);

    }
    if(rs(nod)<=N && a[h[fiu]]>a[h[rs(nod)]]){
        fiu=rs(nod);
    }
    if(nod!=fiu){
        swap(pos[h[nod]],pos[h[fiu]]);
        swap(h[fiu],h[nod]);
        coboara(fiu);
    }
}
void insert(    int X   ){
    h[++N]=X;
    pos[X]=N;
    urca(N);
}

void erase( int X ){
      swap(pos[h[N]],pos[h[x]]);
      swap(h[x],h[N]);
        --N;
        coboara(X);
}
int main () {

    f>>n;

    for(i=1;i<=n;++i){

        f>>op;

        if(op==1){
            f>>x;
            a[++cnt]=x;
            insert(cnt);
            continue;

        }
        if(op==2){
            f>>x;
            erase(pos[x]);
            continue;
        }
        if(op==3){
            g<<a[h[1]]<<"\n";
        }
    }
    return 0;
}