Cod sursa(job #523279)

Utilizator LuffyBanu Lavinia Luffy Data 17 ianuarie 2011 17:37:39
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define dim 200005
using namespace std;

int i,n,cod,x,v[dim],k,poz[dim],a,coada[dim];

void swap(int &a, int &b)
{int c;
c=a; a=b; b=c;
}

void insert()
{int i;
 k++; poz[k]=k;
 if(!v[1]) {v[1]=x; poz[1]=1;}
 else
 {v[k]=x; i=k;
    if(v[k/2]>v[k])
	   while(1 && i>=1)
	  {swap(v[i],v[i/2]); swap(poz[i],poz[i/2]); i=i/2; 
	   if(v[i/2]<v[i]) break;
	  }
	
  }

}

void sterg()
{int i;
for(i=1;i<=k;i++) 
	coada[poz[i]]=i;

x=coada[x];
v[x]=v[k]; v[k]=0; poz[x]=poz[k]; poz[k]=0; i=x; k--;
 if(v[i]<v[i/2])
  while(1 && i>=1)
	  {swap(v[i],v[i/2]); swap(poz[i],poz[i/2]); i=i/2; 
	   if(v[i/2]<v[i]) break;
	  }
  
 if( (v[i]>v[i*2] || v[i]>v[i*2+1]) && (i*2<=k) )
  while(1 && i<=k)
   {swap(v[i],v[i*2]); swap(poz[i], poz[i*2]); i=i*2;
     if(v[i]>v[i*2] || v[i]>v[i*2+1]) break;}

}

int main()
{
 FILE *f=fopen("heapuri.in","r"), *g=fopen("heapuri.out","w");
 
 fscanf(f,"%d",&n);
  for(i=1;i<=n;i++)
 {fscanf(f,"%d",&cod);
  if(cod==1) {fscanf(f,"%d",&x); insert();}
  else if(cod==2) {fscanf(f,"%d",&x); sterg();}
  else fprintf(g,"%d\n",v[1]);
 }
 
 
fclose(f);
fclose(g);
return 0;
}