Cod sursa(job #235663)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 decembrie 2008 01:51:37
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<stdio.h>
#define N 200010
int n,i,j,cod,h[N],val,lh,poz1[N],cit,pcit,poz2[N];
void read_solve(),hu(int ic),hd(int ic,int nc),sw(int i1,int i2);
int main()
{
	read_solve();
	return 0;
}
void read_solve()
{
	freopen("heapuri.in","rt",stdin);
	freopen("heapuri.out","wt",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{ scanf("%d",&cod);
	  if(cod==3){printf("%d\n",h[1]);continue;}
	  if(cod==1){scanf("%d",&val);h[++lh]=val;poz1[++cit]=lh;poz2[lh]=cit;hu(lh);continue;}
	  scanf("%d",&pcit);
	  j=poz2[pcit];sw(j,lh);lh--;hu(j);hd(j,lh);
	}
}
void sw(int i1,int i2)
{
	int aux=h[i1];h[i1]=h[i2];h[i2]=aux;
	aux=poz1[i1];poz1[i1]=poz1[i2];poz1[i2]=aux;
	poz2[poz1[i1]]=i1;poz2[poz1[i2]]=i2;
}
void hu(int ic)
{
	int is=ic>>1;
	if(is&&h[is]>h[ic]){sw(is,ic);hu(is);}
}
void hd(int ic,int nc)
{
	int is=ic<<1;
	if(is>nc)return;
	if(is<nc)if(h[is+1]<h[is])is++;
	if(h[is]<h[ic]){sw(is,ic);hd(is,nc);}
}