Pagini recente » What is title? we don't even | Cod sursa (job #645739) | Cod sursa (job #1080633) | Cod sursa (job #304303) | Cod sursa (job #2538445)
#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;
}