Pagini recente » Cod sursa (job #2353549) | Cod sursa (job #1972732) | Cod sursa (job #874551) | Cod sursa (job #3030129) | Cod sursa (job #2222815)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iomanip>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int pos[200001];
pair<int, int> v[200002];
int heaplevel = 1;
void lift(int ind);
void dec(int ind);
void insertelem(int val);
void deleteelem(int ind);
void swp (int ind1, int ind2);
void deleteelem (int ind) {
swp (ind, heaplevel-1);
///shake the lil burger up
heaplevel--;
lift(ind);
dec(ind);
}
void insertelem(int val, int addcnt) {
v[heaplevel].first = val;
v[heaplevel].second = addcnt;
pos[addcnt] = heaplevel;
lift(heaplevel);
heaplevel++;
}
void lift (int ind) {
if (ind != 1)
if (v[ind].first < v[ind/2].first) {
swp(ind, ind/2);
lift(ind/2);
}
}
void swp (int ind1, int ind2) {
swap (pos[v[ind1].second], pos[v[ind2].second]);
swap (v[ind1], v[ind2]);
}
void dec (int ind) {
if (2 * ind + 1 < heaplevel) {
if (v[2 * ind].first < v[2 * ind + 1].first && v[2 * ind].first < v[ind].first) {
swp(2 * ind, ind);
dec (2 * ind);
} else if (v[2 * ind + 1].first < v[2 * ind].first && v[2 * ind + 1].first < v[ind].first) {
swp(2 * ind + 1, ind);
dec (2 * ind + 1);
}
} else if (2 * ind < heaplevel) {
if (v[2 * ind].first < v[ind].first) {
swp(2 * ind, ind);
dec (2 * ind);
}
}
}
int addz = 1;
int main () {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int n;
cin >> n;
int sos = 0;
for (int i = 0; i < n; i++) {
int op;
cin >> op;
if (op == 1) {
int val;
cin >> val;
insertelem(val, addz);
addz++;
} else if (op == 2) {
int ord;
cin >> ord;
deleteelem(pos[ord]);
} else if (op == 3) {
cout << v[1].first << '\n';
}
}
}