Cod sursa(job #2538445)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 4 februarie 2020 19:10:21
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cassert>

#define INF 1<<30

std::ifstream fin ( "heapuri.in" );
std::ofstream fout ( "heapuri.out" );

struct Node {
	int key;
	Node* last;
	Node* left;
	Node* right;
	Node ( int x ) {
		key = x;
		last = left = right = NULL;
	}
};

class Heap {
	private : Node* start;

	public : Heap() {
		start = new Node ( INF );
	}

	public : Node* getNode ( int key ) {
		Node* p = start;
		while ( p != NULL && p -> key != key ) {
			if ( p -> key > key )
				p = p -> left;
			else
				p = p -> right;
		}
		assert ( p != NULL );
		return p;
	}

	public : void insert ( Node* node ) {
		Node* p = start;
		Node* last = NULL;
		int dir = 1;
		while ( p != NULL ) {
			last = p;
			if ( node -> key < p -> key ) {
				p = p -> left;
				dir = 1;
			} else {
				p = p -> right;
				dir = 2;
			}
		} 
		free ( p );
		node -> last = last;
		if ( dir == 1 )
			last -> left = node;
		else
			last -> right = node;
		free ( last );
	}

	public : void erase ( int key )	{
		Node* p = this -> getNode ( key );
		//std::cout << poz[key] -> key << "ye\n";
		if ( p -> last -> left -> key == key )
			 p -> last -> left = NULL;
		else
			 p -> last -> right = NULL;
		if ( p -> left != NULL ) 
			 this -> insert ( p -> left );
		if ( p -> right != NULL )
		     this -> insert ( p -> right );
	}

	public : int getMin () {
		Node* p = start;
		while ( p -> left != NULL )
			p = p -> left;
		return p -> key;
	}
};

std::vector <int> st;

int main() {
	int N;

	fin >> N;

	Heap* heap = new Heap();

	for ( int i = 1; i <= N; ++i ) {	
		int q, x;
		fin >> q;
		if ( q == 1 ) {
			fin >> x;
			Node* node = new Node ( x );
			heap -> insert ( node );
			st.push_back ( x );
			free ( node );
		} else if ( q == 2 ) {
			fin >> x;
			assert ( x > 0 );
			heap -> erase ( st[x - 1] );
		} else
			fout << heap -> getMin () << '\n';
	}

	free ( heap );

	return 0;
}