Pagini recente » Cod sursa (job #581204) | Cod sursa (job #394509) | Cod sursa (job #1956535) | Cod sursa (job #1672630) | Cod sursa (job #944766)
Cod sursa(job #944766)
#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;
}