Cod sursa(job #1653014)

Utilizator RaduHHarhoi Radu RaduH Data 15 martie 2016 17:40:01
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#define N 200010
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,v,x,lg,Q[N],i;
typedef int Heap[N];
Heap H;
int Father(int nod){
    return nod/2;
}
int LeftSon(int nod){
    return nod*2;
}
int RightSon(int nod){
    return nod*2+1;
}
void Sift(Heap H, int n, int k){
    int son;
    do{
        son=0;
        if(LeftSon(k)<=n)
        {
            son=LeftSon(k);
            if(RightSon(k)<=n && H[RightSon(k)]<H[LeftSon(k)])
                son=RightSon(k);
            if(H[son]>=H[k])
                son=0;
        }
        if(son)
        {
            swap(H[k],H[son]);
            k=son;
        }
    }while(son);
}
void Percolate(Heap H, int k){
    while(H[k]<H[Father(k)])
    {
        swap(H[k],H[Father(k)]);
        k=Father(k);
    }
}
void BuildHeap(Heap H, int n){
    int i;
    for(i=n/2;i>=1;--i)
        Sift(H,n,i);
}

int main(){
    fin>>n>>v>>x;
    H[1]=x;
    Q[1]=x;
    lg=1;
    while(n>1)
    {
        --n;
        fin>>v;
        if(v<3)
            fin>>x;
        switch(v)
        {
            case 1:{
                lg++;
                H[lg]=x;
                Q[lg]=x;
                Percolate(H,lg);
            }break;
            case 2:{
                for(i=1;i<=lg;++i)
                    if(H[i]==Q[x])
                    {
                        swap(H[i],H[lg]);
                        break;
                    }
                lg--;
                if(i>1 && H[i]<Father(i))
                    Percolate(H,i);
                else
                    Sift(H,lg,i);
            }break;
            case 3:{
                fout<<H[1]<<'\n';
            }break;
        }
    }
    fin.close();
    fout.close();
    return 0;
}