Cod sursa(job #331910)

Utilizator ConsstantinTabacu Raul Consstantin Data 15 iulie 2009 18:55:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>
#include<string.h>
#define dim 200020
struct heap{unsigned int a,ord;}v[dim];
int poz[dim];
unsigned int ok,x,i,n;

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


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


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

}

void del(int x){
unsigned int m;
m=poz[x];

v[poz[x]].a=-1;


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


}


void citire(){

int i,n,ok,x;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
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;}