Pagini recente » Cod sursa (job #937131) | Cod sursa (job #248941) | Cod sursa (job #1528661) | Cod sursa (job #2472224) | Cod sursa (job #2291034)
#include <cstdio>
using namespace std;
const int NMAX = 200005;
const int INF = 0x7fffffff;
struct Pozitii {
int val, poz;
};
Pozitii v[NMAX];
int poznr[NMAX];
void schimb(int i, int j) {
int aux2 = poznr[v[i].poz];
poznr[v[i].poz] = poznr[v[j].poz];
poznr[v[j].poz] = aux2;
int aux = v[i].val;
v[i].val = v[j].val;
v[j].val = aux;
aux = v[i].poz;
v[i].poz = v[j].poz;
v[j].poz = aux;
}
void update_jos(int nod) {
int poz = nod / 2;
if(poz > 0 && v[poz].val > v[nod].val) {
schimb(nod, poz);
update_jos(poz);
}
}
int update_sus(int nod) {
int poz = -1;
if(v[nod].val > v[2 * nod].val && v[nod].val > v[2 * nod + 1].val) {
poz = 2 * nod + 1;
if(v[2 * nod].val < v[2 * nod + 1].val) {
poz--;
}
}
else if(v[nod].val > v[2 * nod].val){
poz = 2 * nod;
}
else if(v[nod].val > v[2 * nod + 1].val) {
poz = 2 * nod + 1;
}
if(poz != -1) {
schimb(nod, poz);
return update_sus(poz);
}
return nod;
}
int main() {
int n, total = 0, top = 0;
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
v[i].val = INF;
}
for(int nrop = 1; nrop <= n; nrop++) {
int op;
scanf("%d", &op);
if(op == 1) {
scanf("%d", &v[++top].val);
poznr[++total] = top;
v[top].poz = total;
update_jos(top);
}
else if(op == 2) {
int nr;
scanf("%d", &nr);
int pozitie = poznr[nr];
schimb(top, poznr[nr]);
v[top--].val = INF;
pozitie = update_sus(pozitie);
update_jos(pozitie);
}
else {
printf("%d\n", v[1].val);
}
}
return 0;
}