Cod sursa(job #539382)

Utilizator Rares95Rares Arnautu Rares95 Data 22 februarie 2011 21:42:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
/*
a[ i ]= elementul intrat al i-lea in multime (deci, practic sirul pe care il citesc)
heap[ i ]= pozitia in sirul a a elementului de pe pozitia i in heap
poz[ i ]= pozitia in heap a elementului de pe poztia i in sirul a
a[heap[ i ]]= valoarea elementului de pe pozitia i in heap
Si de aici lucrezi cu a[heap[ i ]] cand compari valorile. Vectorul poz il folosesti ca sa stii instant care element il stergi.
*/

# include <cstdio>
# include <algorithm>
# define min a [ heap [ 1 ]]
# define open_files freopen ("heapuri.in", "r", stdin); freopen ("heapuri.out", "w", stdout)
  using namespace std;
	typedef int Array [200001];
	
	int noduri, nrela, tip, n, x;
	Array a, heap, poz;
	
	void urca (int x)
	{ while (x / 2 && a [ heap [ x ]] < a [ heap [ x / 2 ]]) // nu a ajuns la radicina si fiul e mai mic ca tatal
		{ swap (heap [ x ], heap [ x / 2 ]); // interschimba fiul cu tatal
			poz [ heap [ x ]] = x; 
			poz [ heap [ x / 2 ]] = x / 2;
			x /= 2; // trecem la urmatorul nivel
		}
	}
	
	void coboara (int x)
	{	int y = 0;
		
		while (x != y)
		{	y = x;
			if (y * 2 <= noduri && a [ heap [ x ]] > a [ heap [ y * 2]]) x = y * 2;
			if (y * 2 + 1 <= noduri && a [ heap [ x ]] > a [ heap [ y * 2 + 1 ]]) x = y * 2 + 1;
			swap (heap [ x ], heap [ y ]);
			poz [ heap [ x ]] = x; 
			poz [ heap [ y ]] = y;
		}
	}
	
	int main ()
	{	open_files;
		scanf ("%d", &n);
		
		for (; n; --n)
		{	scanf ("%d", &tip);
			if (tip < 3) scanf ("%d", &x);
		
			if (tip == 1)
			{	noduri++; nrela++;
				a [ noduri ] = x; 
				heap [ noduri ] = nrela;
				poz [ nrela ] = noduri;
				
				urca (noduri);
			}
			
			if (tip == 2)
			{	a [ x ] = -1;
				urca (poz[x]);
				
				poz [ heap [ 1 ]] = 0;
				heap [ 1 ] = heap [ noduri-- ];
				poz [ heap [ 1 ]] = 1;
				if (noduri > 1) coboara (1);
			}
			
			if (tip == 3) printf ("%d\n", min);
		}
		return 0;
	}