Cod sursa(job #539392)

Utilizator titeltitel popescu titel Data 22 februarie 2011 21:55:25
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 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);}
}
//void insertheap(int i)
//{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 1 : H[++nh]=x; poz[nh]=++nr_insert; pos[nr_insert]=nh; upheap(nh); break;
		 case 2 : k=pos[x]; swap(k, nh--); downheap(k); break;
		 case 3 : printf("%d\n", H[1]);
		}
	}
 return 0;
}