Pagini recente » Cod sursa (job #913745) | Cod sursa (job #464342) | Cod sursa (job #1953133) | Cod sursa (job #3182355) | Cod sursa (job #1887270)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <assert.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
#define NMAX 200001
int n, L, NR;
int Heap[NMAX], /// Heap[x] = al catelea element in ordine cronologica sa afla in x,
Pos[NMAX], /// Pos[x] = pe ce pozitie in arbore(heap) se afla al x-lea element in ordine lexicografica
A[NMAX]; /// A[x] = valoare celui de al x-lea element;
void promoveaza(int k) {
int aux;
while(k > 1 && A[Heap[k]] < A[Heap[k/2]]) {
aux = Heap[k/2];
Heap[k/2] = Heap[k];
Heap[k] = aux;
Pos[Heap[k]] = k;
Pos[Heap[k/2]] = k/2;
k = k / 2;
}
}
void cerne(int x) {
int aux, y = 0;
while (x != y)
{
y = x;
if (y*2<=L && A[Heap[x]]>A[Heap[y*2]]) x = y*2;
if (y*2+1<=L && A[Heap[x]]>A[Heap[y*2+1]]) x = y*2+1;
aux = Heap[x];
Heap[x] = Heap[y];
Heap[y] = aux;
Pos[Heap[x]] = x;
Pos[Heap[y]] = y;
}
}
void afis(int a[NMAX]) {
for(int i = 1; i <= NR; i++)
g<<a[i]<<' ';
g<<'\n';
}
void afisare() {
afis(Pos);
afis(Heap);
afis(A);
g<<'\n';
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, val, cod;
scanf("%d", &n);
for(i = 1; i <= n; i++) {
scanf("%d", &cod);
if(cod < 3)
scanf("%d", &val);
if(cod == 1) {
L++, NR++;
A[NR] = val;
Heap[L] = NR;
Pos[NR] = L;
promoveaza(L);
} else if(cod == 2) {
A[val] = -1;
promoveaza(Pos[val]);
Pos[Heap[1]] = 0;
Heap[1] = Heap[L--];
Pos[Heap[1]] = 1;
if (L>1) cerne(1);
} else {
printf("%d\n", A[Heap[1]]);
}
}
return 0;
}