Cod sursa(job #745089)

Utilizator APOCALYPTODragos APOCALYPTO Data 10 mai 2012 15:22:14
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
using namespace std;
#include<iostream>
#include<fstream>
#define nmax 200020
//#define T (i)/2
#define T (i)/2
#define L (i)*2
#define R L+1
int n=0,nh=0;
int H[nmax],a[nmax],poz[nmax];
ofstream fout("heapuri.out");
void upheap(int i)
{
    if(i<=1) return;
    if(a[H[i]]<a[H[T]])
    {
        swap(H[i],H[T]);
        swap(poz[H[i]],poz[H[T]]);
        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()
{
    int Ti,c,k=0,x,i,y;
    ifstream fin("heapuri.in");
    fin>>Ti;
    while(Ti--)
    {
        fin>>c;
        k++;

        switch(c)
        {
             case 1:
                    fin>>x;
                    a[++n]=x;
                    nh++;
                    H[nh]=n;
                    poz[n]=nh;
                    upheap(poz[n]);
                    break;
             case 2:
                    fin>>x;
                    y=poz[x];
                    swap(H[y],H[nh]);
                    swap(poz[H[y]],poz[H[nh]]);
                    nh--;
                    downheap(y);
                    break;
             case 3:
                    fout<<a[H[1]]<<"\n";


        }

    }

    fin.close();

}

int main()
{
    cit();
    return 0;
}