Pagini recente » Cod sursa (job #2721028) | Cod sursa (job #2894085) | Cod sursa (job #2175652) | Cod sursa (job #1033593) | Cod sursa (job #827535)
Cod sursa(job #827535)
#include <cstdio>
#define NMAX 200001
using namespace std;
FILE *fin = fopen("heapuri.in", "r");
FILE *fout = fopen("heapuri.out", "w");
int N, M, K;
int A[NMAX], H[NMAX], P[NMAX];
// A[i] = pozitia in Heap celui de-al i-lea element
// H[i] = valoarea elementului de pe pozitia i in heap
// P[i] = j (a i-a pozitie in Heap este al j-lea intrat)
void swap(int nod, int up) {
int t;
t = A[P[nod]];
A[P[nod]] = A[P[up]];
A[P[up]] = t;
t = P[nod];
P[nod] = P[up];
P[up] = t;
t = H[nod];
H[nod] = H[up];
H[up] = t;
}
void HeapUp(int nod) {
if(nod < 1) return;
if(H[nod] < H[nod / 2]) {
swap(nod, nod / 2);
HeapUp(nod / 2);
}
}
void HeapDown(int nod) {
int l, r, i;
l = nod * 2;
r = nod * 2 + 1;
if(l <= K && H[l] < H[nod]) i = l;
else i = nod;
if(r <= K && H[r] < H[i]) i = r;
if(i != nod) {
swap(i, nod);
HeapDown(i);
}
}
void HeapCheck(int nod) {
if(H[nod] < H[nod / 2]) HeapUp(nod);
else HeapDown(nod);
}
void ReadData() {
int i, val, cod;
fscanf(fin, "%d", &N);
for(i = 1; i <= N; ++ i) {
fscanf(fin, "%d", &cod);
if(cod == 3) {
fprintf(fout, "%d\n", H[1]);
continue;
}
else fscanf(fin, "%d", &val);
if(cod == 1) {
A[++ M] = ++ K;
P[K] = M;
H[K] = val;
HeapUp(K);
} else {
if(A[val] == -1) fprintf(fout, "BUG!\n");
H[A[val]] = H[K];
P[A[val]] = P[K];
-- K;
HeapCheck(A[val]);
A[val] = -1;
}
}
}
int main() {
ReadData();
return 0;
}