Cod sursa(job #503631)

Utilizator APOCALYPTODragos APOCALYPTO Data 24 noiembrie 2010 01:25:41
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#define Nmax 200005
#define T ((i)/2)
#define L ((i)*2)
#define R ((L)+1)
ofstream fout("heap.out");
int nh=0,n,H[Nmax],d[Nmax],poz[Nmax];
int N;
inline void upheap(int i)
{
    if(i<=1) return;
    if(d[H[T]]>d[H[i]]) swap(poz[H[T]],poz[H[i]]), swap(H[i],H[T]), upheap(T);

}

inline void downheap(int i)
{
    int m=i;

    if(L<=nh)
       if(d[H[m]]>d[H[L]])
         m=L;
    if(R<=nh)
       if(d[H[m]]>d[H[L]])
         m=R;
    if(i!=m) swap(H[m],H[i]), swap(poz[H[m]], poz[H[i]]), downheap(m);

}
void cit()
{int i,c,x,y;
    ifstream fin("heap.in");
     fin>>N;
     for(i=1;i<=N;i++)
     {
         fin>>c;
         if(c==1)
         {fin>>x;
         n++;
         nh++;
         H[nh]=n;
         d[n]=x;
         poz[n]=nh;
         upheap(nh);

         }
         if(c==2)
         {
             fin>>x;
             y=poz[x];
             swap(H[y],H[nh]);
             swap(poz[H[y]],poz[H[nh]]); //watch out
             nh--;
             downheap(y);


         }
         if(c==3)
         {
             fout<<d[H[1]]<<"\n";
         }

     }

}


int main()
{
    cit();
    fout.close();
    return 0;

}