Cod sursa(job #516118)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 23 decembrie 2010 11:30:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
# include <fstream>
# define  BIG  2000000000
  using namespace std;
    int n, nr, elem, v[200100], H[200100], hip[200100], POZ[200100];
    inline int dad (int son){
		return son >> 1;
	}
	inline int son1 (int dad){
		return dad << 1;
	}
	inline int son2 (int dad){
		return (dad << 1) + 1;
	}
	inline void schimba (int &a, int &b){
		int x = a;
		a = b;
		b = x;
	}
	void insertHEAP (int elem){
		hip[++hip[0]] = elem;//pui elementul la sfarsitul heapului
		int poz = hip[0];
		H[v[0]] = hip[0];//al i-lea elem inserat e pe poz hip[0]
		POZ[hip[0]] = v[0];//elem de pe poz hip[0] e al i-lea inserat;
		for (; ; ){
			int tata = dad (poz);
			if (hip[tata] > hip[poz] && tata > 0){
				schimba (hip[tata], hip[poz]);
				schimba (H[POZ[tata]], H[v[0]]);
				schimba (POZ[tata], POZ[poz]);
				schimba (tata, poz);
			}
			else break ;
		}
	}
	void removeHEAP (int elem){
		int poz = H[elem];//pozitia elementului intrat al elem-lea
		hip[poz] = BIG;
		for (; ; ){
			int fiu1 = son1 (poz), fiu2 = son2 (poz);
			if ( (hip[fiu1] < hip[fiu2] || fiu2 > hip[0]) && fiu1 <= hip[0] ){
				schimba (hip[fiu1], hip[poz]);
				schimba (H[elem], H[POZ[fiu1]]);
				schimba (POZ[poz], POZ[fiu1]);
				schimba (poz, fiu1);
			}
			else
			if (hip[fiu1] > hip[fiu2]){
				schimba (hip[fiu2], hip[poz]);
				schimba (H[elem], H[POZ[fiu2]]);
				schimba (POZ[poz], POZ[fiu2]);
				schimba (poz, fiu2);
			}
			else break ;
		}
	}
	int main (){
		ifstream f ("heapuri.in");
		ofstream g ("heapuri.out");
		for (f >> n; n > 0; --n){
			f >> nr;
			if (nr == 1){
				f >> elem;
				v[++v[0]] = elem;
				insertHEAP (elem);
			}
			else
			if (nr == 2){
				f >> elem;
				removeHEAP (elem);
			}
			else g << hip[1] << '\n';;
		}
		g.close ();
		return 0;
	}