Cod sursa(job #351623)

Utilizator otilia_sOtilia Stretcu otilia_s Data 28 septembrie 2009 19:34:03
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
using namespace std;
#define NMAX 200002
int v[NMAX],cr[NMAX],tp[NMAX];

void CombHeap(int i, int n)
{
 int val=v[i],timp=tp[i],t=i,f=2*i;
 while (f<=n)
  {
	if (f<n) 
     if (v[f]>v[f+1])++f;
    if (val>v[f]) {v[t]=v[f]; cr[tp[f]]=t; tp[t]=tp[f]; 
	                 t=f; f<<=1;}
	   else f=n+1; 
   		
  }	 
 v[t]=val; tp[t]=timp; cr[timp]=t;
}

int main()
{
 FILE *fin=fopen("heapuri.in","r");
 FILE *fout=fopen("heapuri.out","w");
 int nrop;
 fscanf(fin,"%d",&nrop);
 int n=0,T=0,tip,i;
 while (nrop--)
  {
   fscanf(fin,"%d",&tip);
   switch (tip)
    {
	 case 1: { fscanf(fin,"%d",&v[++n]); cr[++T]=n; tp[n]=T; 
	             for (i=n/2;i;i--)  CombHeap(i,n); 
				 break;
	           }  
	 case 2: { int x;
		         fscanf(fin,"%d",&x);
				 int poz=cr[x]; cr[x]=0; 
                 v[poz]=v[n]; tp[poz]=tp[n]; cr[tp[n]]=poz;  --n;
              	 for (i=n/2;i;--i) CombHeap(i,n);                  					 
                 break;
				} 
     case 3: { fprintf(fout,"%d\n",v[1]);}			   
    }	 
  }
 fclose(fin); fclose(fout);
}