Cod sursa(job #319521)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 31 mai 2009 22:36:52
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>

#define file_in "heapuri.in"
#define file_out "heapuri.out"

#define Nmax 200100

int N,n,i,t,x,v[Nmax],p[Nmax],h[Nmax],nr,aux,tip;  

inline void up(int x)
{   
int tata,fiu;   
    fiu=x;
    tata=x>>1;	
  
    while (fiu!=1 && v[h[fiu]]<v[h[tata]])
	{   
      aux=h[fiu];
	  h[fiu]=h[tata];
	  h[tata]=aux;   
      p[h[tata]]=tata;   
      p[h[fiu]]=fiu;   
  
      fiu=tata;
	  tata=fiu>>1;   
    }    
  
}   

inline void down(int x)
{   
int fiu,tata;   
    tata=x;
    fiu=x<<1;	
    if(fiu<n && v[h[fiu]]>v[h[fiu+1]])   
      fiu++;  
    while(fiu<=n && v[h[tata]]>v[h[fiu]])
	{   
      aux=h[fiu];
	  h[fiu]=h[tata];
	  h[tata]=aux;    
      p[h[tata]]=tata;   
      p[h[fiu]]=fiu;   
      tata=fiu;
	  fiu=tata<<1;   
      if(fiu<n && v[h[fiu]]>v[h[fiu+1]])   
      fiu++;   
   }   
      
}   



int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &N);
	
	for(i=1;i<=N;++i)
	{
		scanf("%d", &tip);
		if (tip==1)
		{
			scanf("%d", &x);
			nr++;
			n++;
			v[nr]=x;
			h[n]=nr;
			p[nr]=n;
			up(n);
		}
		else
		if (tip==2)
        {
			scanf("%d", &x);
			h[p[x]]=h[n];
			p[h[p[x]]]=p[x];
			n--;
			down(p[x]);
		}
		else
		{
			printf("%d\n", v[h[1]]);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}