Cod sursa(job #1770304)

Utilizator dodecagondode cagon dodecagon Data 3 octombrie 2016 23:47:05
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include <stdio.h>

const int buff_size=4096;
char buff[buff_size];
int _i=buff_size;


int next_int(FILE * in)
{
    char x,y,k=1;
    int z=0;
   
   if (_i==buff_size)
    y=fread(buff,buff_size,1,in),_i=0;
      
     x=1;
 
      while ((x<48 || x> 57) && x!='-')
         {  
          x=buff[_i];
          _i++;
          if (_i==buff_size)
             {
              y=fread(buff,buff_size,1,in);
              _i=0;
             }
         }
 
      while (x>=48 && x<=57 || x=='-')
      {
        if (x=='-') 
          k=-1; else 
        z=(z<<1)+(z<<3)+x-48;
        x=buff[_i];
        _i++;
         if (_i==buff_size)
           {
               y=fread(buff,buff_size,1,in);
               _i=0;
             }
      }
 
    return z*k;
}

int heap[200009],pos[200009],a[200009],n,op,x,i,_n,k;


int update(int k)
{
   int fiu=++_n;
   heap[_n]=k;
   pos[k]=_n;
   while (fiu>>1>0)
   {
   	 if (a[heap[fiu]]<a[heap[fiu>>1]])
   	 {
       heap[fiu]=heap[fiu]^heap[fiu>>1];
       heap[fiu>>1]=heap[fiu]^heap[fiu>>1];
       heap[fiu]=heap[fiu]^heap[fiu>>1];

       pos[k]=fiu>>1;
       pos[heap[fiu]]=fiu;
   	 }

   	 fiu>>=1;
   }
}

void _delete(int v)
{
	int tata=v,fiu=v<<1;
   
	heap[v]=heap[_n--];
	pos[heap[_n+1]]=v;

	while (fiu<=_n)
	{
		
       if (fiu+1<=_n)
       {
       	if (a[heap[fiu]]<a[heap[fiu+1]])
       	{
       		if (a[heap[fiu]]<a[heap[tata]])
       		{
	       		pos[heap[tata]]=fiu;
	       		pos[heap[fiu]]=tata;
	       		heap[tata]=heap[tata]^heap[fiu];
	       		heap[fiu]=heap[tata]^heap[fiu];
	       		heap[tata]=heap[tata]^heap[fiu];
       	    }
       		
       	} else 
       	 if (a[heap[fiu+1]]<a[heap[tata]])
       	 {
       	 	pos[heap[tata]]=fiu+1;
       		pos[heap[fiu+1]]=tata;
       	 	heap[tata]=heap[tata]^heap[fiu+1];
       		heap[fiu+1]=heap[tata]^heap[fiu+1];
       		heap[tata]=heap[tata]^heap[fiu+1];
            fiu=fiu+1;
       	 }
       } else 
       if (a[heap[fiu]]<a[heap[tata]])
       {
       	    pos[heap[tata]]=fiu;
       		pos[heap[fiu]]=tata;
       	    heap[tata]=heap[tata]^heap[fiu];
       		heap[fiu]=heap[tata]^heap[fiu];
       		heap[tata]=heap[tata]^heap[fiu];
       }

       tata=fiu;
       fiu<<=1;    
	}
}


int main(int argc, char const *argv[])
{
	 
	 freopen("heapuri.in","r",stdin);
	 freopen("heapuri.out","w",stdout);

	  n=next_int(stdin);


	  for (i=0;i<n;++i)
	  {
	  	op=next_int(stdin);
	  	if (op==1) 
	  	  {
	  	  	x=next_int(stdin);
	  	  	a[k++]=x;
	  	  	update(k-1);
	  	  } else 
	  	  if (op==2)
	  	  {
	  	  	x=next_int(stdin);
	  	  	_delete(pos[x-1]);
	  	  } else 
	  	  if (op==3)
	  	  	printf("%d\n",a[heap[1]]);
	  }

	 fclose(stdin);
	 fclose(stdout);


	return 0;
}