Cod sursa(job #539401)

Utilizator titeltitel popescu titel Data 22 februarie 2011 22:02:43
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
// Problema "heapuri" infoarena
// H este un min-heap
// pos[i] pozitia inserarii numarul i, in heapul H
// poz[i] numarul inserarii ce se afla pe pozitia i in heapul H
#include <stdio.h>
#include <stdlib.h>
#define N 200001
#define T ((i)>>1)
#define L ((i)<<1)
#define R (L+1)
int n,nh,nr_insert,tip,x,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);}
}

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 : H[++nh]=x; poz[nh]=++nr_insert; pos[nr_insert]=nh; upheap(nh); break;/*  se insereaza elementul x in multime */
		 case 2 : k=pos[x]; swap(k, nh--); downheap(k); break; /*se sterge elementul intrat al x-lea in multime (in ordine cronologica)*/
		 case 3 : printf("%d\n", H[1]);/* se afiseaza elementul minim din multime */
		}
	}
 return 0;
}