Cod sursa(job #524495)

Utilizator APOCALYPTODragos APOCALYPTO Data 21 ianuarie 2011 21:22:37
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
using namespace std;
#include<iostream>
#include<fstream>

#define T (i)/2
#define L (i)*2
#define R (L)+1
#define nmax 200005
int n,nh,M;
int H[nmax],poz[nmax],a[nmax];
ofstream fout("heapuri.out");
void upheap(int i)
{
    if(i<=1) return;
    if(a[H[T]]>a[H[i]]) {swap(H[T],H[i]); swap(poz[H[T]],poz[H[i]]); upheap(T);}
}

void downheap(int i)
{
    int m=i;
    if(L<=nh)
       if(a[H[m]]>a[H[L]])
          m=L;
    if(R<=nh)
       if(a[H[m]]>a[H[R]])
          m=R;
    if(m!=i)  {swap(H[m],H[i]);swap(poz[H[m]],poz[H[i]]);downheap(m);}
}
void cit()
{
    ifstream fin("heapuri.in");
    int x,op;
    fin>>M;
    while(M--)
    {
        fin>>op;
        if(op==1)
        {   fin>>x;
            a[++n]=x;
            nh++;
            H[nh]=n;
            poz[n]=nh;

            upheap(poz[n]);
        }
        if(op==2)
        {
            fin>>x;
            int y=poz[x];
            swap(H[y],H[nh]);
            swap(poz[H[y]],poz[H[nh]]);
            nh--;
            downheap(y);
        }
        if(op==3)
        {
            fout<<a[H[1]]<<"\n";
        }
    }

    fin.close();

}

int main()
{
    cit();


    fout.close();
    return 0;
}