Cod sursa(job #944766)

Utilizator howsiweiHow Si Wei howsiwei Data 29 aprilie 2013 18:15:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;
typedef pair<int,int> ii;

vector<int> v(1);

template<typename T>
class SkewHeap
{
public:
	SkewHeap() : root(NULL) {}

	void meld( SkewHeap & H ) {
		root = meld( root, H.root );
	}

	void insert( T val ) {
		Node * t = new Node(val);
		root = meld( root, t );
	}

	T & top() {
		return root->key;
	}

	void pop() {
		Node * new_root = meld( root->left, root->right );
		delete root;
		root = new_root;
	}

private:
	struct Node {
		Node( int key ) : left(NULL), right(NULL), key(key) {}
		Node * left;
		Node * right;
		T key;
	};

	Node * root;

	bool cmp( Node * t1, Node * t2 ) {
		return v[t1->key] < v[t2->key];
	}

	Node * meld( Node * t1, Node * t2 ) {
		if (t1 == NULL) return t2;
		if (t2 == NULL) return t1;
		if (!cmp(t1, t2)) swap(t1, t2);
		t1->right = meld( t1->right, t2 );
		swap( t1->left, t1->right );
		return t1;
	}
};

int main()
{
	ifstream fin("heapuri.in");
	ofstream fout("heapuri.out");
	int n;
	fin >> n;
	SkewHeap<int> a;
	bitset<200001> deleted;

	for (int nth = 1, i = 1; i <= n; ++i) {
		int op, x;
		fin >> op;
		switch (op) {
			case 1: fin >> x;
					v.push_back(x);
					a.insert(nth++);
					break;
			case 2: fin >> x;
					deleted[x] = true;
					break;
			case 3: while (deleted[a.top()]) a.pop();
					fout << v[a.top()] << '\n';
					break;
		}
	}
	return 0;
}