Pagini recente » Cod sursa (job #167611) | Cod sursa (job #2705234) | Cod sursa (job #2604258) | Cod sursa (job #2640498) | Cod sursa (job #1622710)
#include <bits/stdc++.h>
#define maxi 1000000005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n;
vector<int> H; /// index
vector<int> V; /// value
vector<int> O; /// order
void heapify(int len) {
int poz = len;
while (poz > 0) {
if (V[H[poz]] < V[H[poz/2]]) {
int aux = H[poz];
H[poz] = H[poz/2];
H[poz/2] = aux;
O[H[poz]] = poz;
O[H[poz/2]] = poz/2;
poz /= 2;
} else {
break;
}
}
}
inline int minim(int a, int b) {
if (a<b)return a;
return b;
}
void del(int len, int no) {
V[no] = maxi;
int poz = O[no];
while (poz < len) {
int left = 2*poz;
int right = 2*poz+1;
if (left > len) left = poz;
if (right > len) right = poz;
int chosen;
if (minim(V[H[left]], V[H[right]]) != V[H[poz]]) {
if (minim(V[H[left]], V[H[right]]) == V[H[left]]) {
chosen = left;
} else {
chosen = right;
}
} else
chosen = poz;
int aux = H[chosen];
H[chosen] = H[poz];
H[poz] = aux;
O[H[chosen]] = chosen;
O[H[poz]] = poz;
if (poz == chosen) break;
poz = chosen;
}
}
void read() {
int op = 0;
f>>n;
H.resize(n);
V.resize(n);
O.resize(n);
for (int i=0;i<n;i++) {
int tip;
int x;
f>>tip;
if (tip == 1) {
f>>x;
H[op] = op; /// indexul numarului pe pozitia i
V[op] = x; /// valoarea numarului cu indexul i
O[op] = op; /// pozitia numarului ce are indexul i
heapify(op); op++;
} else if (tip == 2) {
f>>x;
del(i, x-1);
} else if (tip == 3) {
g<<V[H[0]]<<'\n';
}
}
}
int main() {
read();
f.close(); g.close();
return 0;
}