Cod sursa(job #866263)

Utilizator RobertSSamoilescu Robert RobertS Data 27 ianuarie 2013 18:39:21
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include<iostream>
#include<fstream>
using namespace std;
#define MAX_N 200000
typedef long long Heap[MAX_N];

long n; // numarul de randuri ce urmeaza a fi citite
Heap heap; // vectorul de heapuri
long size; // lungimea vectorului de heapuri

struct lista{
	long p1, p2;
}pozitii[MAX_N]; //retine pozitiile elementelor intrate 

/// returneaza radacina, deci minimul (minheap)
inline long long minim(){
	return heap[1];
}

// retuneaza tata elementului de pe pozitia k
inline long long tata(long k){
	return k/2;
}

//-----===Returneaza pozitia filui din stanga ===---//
inline long long fiu_stanga(long k){
	return 2*k;
}

//-----====Returneaza pozitia filui din dreapta---=====//
inline long long fiu_dreapta(long k){
	return 2*k+1;
}


//---=== urca elementul in heap === ----///
void urca(long long pos){
	long t = tata(pos);
	if(t){
		if(heap[t] > heap[pos]){
			swap(heap[t],heap[pos]);
			swap(pozitii[t].p2,pozitii[pos].p2);
			urca(t);
		}
	}
	
}

///---==coboara elementul in heap ===---//
void coboara(long long pos){
	long fs = fiu_stanga(pos);
	long fd = fiu_dreapta(pos);
	
	
	if(fs<=size &&heap[pos] > heap[fs]){
		swap(heap[pos], heap[fs]), swap(pozitii[pos].p2,pozitii[fs].p2),coboara(fs);
	}else if(fd<=size && heap[pos] > heap[fd]){
		swap(heap[pos], heap[fd]), swap(pozitii[pos].p2,pozitii[fd].p2); coboara(fd);
	}
}


void sterge(long pos){
	long pos_final;
	for(int i=1; i<=size; i++)
		if(pos == pozitii[i].p2){
			pos_final = pozitii[i].p1; break;
		}
	
	swap(heap[pos_final], heap[size]);
	size --; // micsorez dimensiunea heapului;
	coboara(pos_final); // cobor in heap frunza;
}

void adauga(long long element){
	size ++;
	heap[size] = element;
	
	pozitii[size].p1 = size;
	pozitii[size].p2 = size;
	
	if(size != 1)
		urca(size); // urca in arbore pt a crea un minheap
}


int main(){

	ifstream fin("heapuri.in");
	ofstream fout("heapuri.out");
	
	
	fin >> n;
	
	for(long i=1; i<=n; i++){
		short int operatie;
		long long element;
		fin >> operatie;
			if(operatie == 1){
				fin >> element, adauga(element);
			}else if(operatie == 2){
				fin >> element;
				sterge(element);
			}else if(operatie == 3){
				fout << minim() << '\n';
			}
	}
	
	
return 0;
}