Cod sursa(job #331423)

Utilizator ConsstantinTabacu Raul Consstantin Data 13 iulie 2009 22:00:08
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#include<string.h>
#define dim 200020
unsigned int v[dim],ord[dim],poz[dim];
unsigned int ok,x,i,n;

void swap(int a,int b){
int c;
c=v[a];v[a]=v[b];v[b]=c;
c=ord[a];ord[a]=ord[b];ord[b]=c;
c=poz[ord[a]];poz[ord[a]]=poz[ord[b]];poz[ord[b]]=c;

}


void insert(int val){
n++;
v[n]=val;
ord[n]=n;
poz[n]=n;
int m=n;


while(v[m]<v[m/2]&&(m/2))
	{swap(m,m/2);m/=2;}

}

void del(int x){
unsigned int m,test=0;
m=poz[x];
swap(n,poz[x]);
v[n]=-1;
n--;

while(m<=n/2)
	if(v[m*2]<v[m*2+1]&&v[m*2]<v[m]){swap(m,m*2);m=m*2;}
	else
	if(v[m*2+1]<v[m*2]&&v[m*2+1]<v[m]){swap(m,m*2+1);m=m*2+1;}
	else
		break;


}


void citire(){

int i,n,ok,x;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
memset(v,1,sizeof(v));
for(i=1;i<=n;i++)
	{scanf("%d",&ok);
	

switch (ok){
case 1:scanf("%d",&x);insert(x);break;	
case 2:scanf("%d",&x);del(x);break;
case 3:printf("%d\n",v[1]);break;}
	
	}
}


int main(){

citire();

return 0;}