Pagini recente » Cod sursa (job #2568959) | Cod sursa (job #167157) | Cod sursa (job #2808018) | Cod sursa (job #244115) | Cod sursa (job #2296290)
#include<fstream>
#include<vector>
#include<string>
#define N 200000
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
vector<bool> erased;
class Heap{
public:
int value;
int id;
Heap (int a = 0, int b = 0){
value = a;
id = b;
}
bool operator < (Heap a){
return (value < a.value);
}
bool isErased(){
return erased[id];
}
};
vector<Heap> heap;
void insertHeap(Heap x){
heap.push_back(x);
int p = heap.size() - 1;
while(p > 0){
if (heap[p] < heap[(p - 1) / 2]){
swap(heap[p], heap[(p - 1) / 2]);
p = (p - 1) / 2;
}
else break;
}
}
void popHeap(){
int x = heap[0].value;
swap(heap[0], heap.back());
heap.pop_back();
int p = 0;
while(p < heap.size()){
//cout << p << ' ' << heap[p].value << endl;
int fiu = p;
if (p * 2 + 1 < heap.size() && heap[p * 2 + 1] < heap[fiu]){
fiu = 2 * p + 1;
}
if (p * 2 + 2 < heap.size() && heap[p * 2 + 2] < heap[fiu]){
fiu = p * 2 + 2;
//cout << 2 * p + 2 << ' ' << heap[2 * p + 2].value << endl;
}
//if (x == 12) cout << p << ' ' << fiu << endl;
if (fiu == p) break;
swap(heap[p], heap[fiu]);
p = fiu;
}
}
void insert(int x){
while(!heap.empty() && heap[0].isErased()){
//if (heap[0].value == 12) cout << heap[1].value << ' ' <<heap[2].value << endl;
popHeap();
}
//cout << x << ' ' << erased.size() << endl;
insertHeap(Heap(x, erased.size()));
erased.push_back(false);
}
void erase(int x){
erased[x] = true;
while(!heap.empty() && heap[0].isErased()){
//if (heap[0].value == 12) cout << heap[1].value << ' ' <<heap[2].value << endl;
popHeap();
}
}
int query(){
while(!heap.empty() && heap[0].isErased()){
//if (heap[0].value == 12) cout << heap[1].value << ' ' <<heap[2].value << endl;
popHeap();
}
if (!heap.empty()) return heap[0].value;
else return -1;
}
string s;
int p;
int getInt(){
if (p == s.size()){
cin >> s;
p = 0;
}
while(s[p] == ' ') p++;
int nr = 0;
while(p < s.size() && s[p] >= '0' && s[p] <= '9'){
nr = nr * 10 + s[p] - '0';
p++;
}
return nr;
}
int main(){
int n = getInt();
//cin >> n;
for(int i = 1; i <= n; i++){
int op = getInt();
//cin >> op;
if (op == 3) cout << query() << endl;
else {
int x = getInt();
//cin >> x;
if (op == 1) insert(x);
if (op == 2) erase(x - 1);
}
}
return 0;
}