Cod sursa(job #771113)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 24 iulie 2012 19:33:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
using namespace std;


int H[200010]; //H[i] = indicele elementului intrat in heap al H[i] - lea si valoarea lui este V[H[i]]  
int P[200010]; //P[i] = indicele din heap al alementului adaugat al i - lea in multime
int V[200010];

int N, t, m, nr, x, aux, pc, p, c;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int main() {
	
	f>>N;
	
	for (;N;N--) {
		f>>t;
		if (t==3) {
			g<<V[H[1]]<<"\n";
		} else if (t==1) {
			f>>V[++nr];
			//inserez pe x in heap;
			m++;
			P[nr] = m;
			H[m] = nr;
			
			c = m;
			p = c/2;
			while (p>=1 && V[H[c]] < V[H[p]]) {
				
				aux = H[c];
				H[c] = H[p];
				H[p] = aux;
				
				P[ H[c] ] = c;
				P[ H[p] ] = p;
				
				c = p;
				p = p/2;
			}
			
		} else {
			f>>x;
			//sterg elementul intrat al x - lea in multime. El este in heap pe pozitia P[x]
			//1 inlocuiesc acest element cu ultimul si numarul de elemente din heap va scadea cu 1
			H[P[x]] = H[m--];
			// sunt 2 posibilitati: fie elementul adus in acest loc este mai mic ca tatal lui
			pc = P[x];
			if (pc/2 !=0 && V[H[pc]]<V[H[pc/2]]) {
				//urc elementul
				c = pc;
				p = c/2;
				while (p!=0 && V[H[c]]<V[H[p]]) {
					aux = H[c];
					H[c] = H[p];
					H[p] = aux;
					P[H[c]] = c;
					P[H[p]] = p;
					c = p;
					p = p/2;
				}
			} else {
				//cobor elementul
				p = pc;
				c = 2*p;
				while (c <= m) {
					if (c+1<=m && V[H[c+1]]<V[H[c]])
						c++;
					if (V[H[p]] > V[H[c]]) {
						aux = H[p];
						H[p] = H[c];
						H[c] = aux;
						
						P[H[c]] = c;
						P[H[p]] = p;
						
						p = c;
						c = 2*c;
					} else
						break;
				}
			}
		}
	}
	
	return 0;
}