Cod sursa(job #539345)

Utilizator titeltitel popescu titel Data 22 februarie 2011 21:09:06
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
// Problema "heapuri" infoarena
#include <stdio.h>
#include <stdlib.h>
#define N 200001
#define T ((i)>>1)
#define L ((i)<<1)
#define R (L+1)
int n,tip,x,nh,nr_insert,k; 
int H[N], poz[N],pos[N];

inline void swap(int i, int j)
{int t=H[i]; H[i]=H[j]; H[j]=t;
 t=poz[i]; poz[i]=poz[j]; poz[j]=t;
 pos[poz[i]]=i;
 pos[poz[j]]=j;
}

inline void upheap(int i)
{if(i>1 && H[i] < H[T]) {swap(i, T); upheap(T);}}

inline void downheap(int i)
{int m=i;
 if(L<=nh) if(H[L] < H[m]) m=L;
 if(R<=nh) if(H[R] < H[m]) m=R;
 if(m!=i) {swap(i, m); downheap(m);}
}
void insertheap(int i)
{nh++; H[nh]=i; poz[nh]=++nr_insert; pos[nr_insert]=nh; upheap(nh);}

int main()
{freopen("heapuri.in", "r",stdin); 
 freopen("heapuri.out","w",stdout);
 scanf("%d", &n);
 while(n--)
	{scanf("%d", &tip);
	 if(tip!=3) scanf("%d", &x);
	 switch(tip)
		{case 1 : insertheap(x); break;
		 case 2: {k=pos[x]; swap(k, nh--); downheap(k);} break;
		 case 3: printf("%d\n", H[1]);
		}
	}
 return 0;
}