Pagini recente » Cod sursa (job #2494599) | Cod sursa (job #2627689) | Cod sursa (job #752062) | Cod sursa (job #894452) | Cod sursa (job #2809115)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 262144
#define INF 1000000001
int arb[2 * MAXN], poz[MAXN], revpoz[2 * MAXN], v[MAXN], nrn[2 * MAXN];
void adauga(int i, int el, int n){
int aux, nod;
nod = 1;
while(arb[nod] != INF){
nod *= 2;
if(arb[nod] != INF){
if(nrn[nod + 1] < nrn[nod]){
nod++;
}
}
}
arb[nod] = el;
poz[i] = nod;
revpoz[nod] = i;
nrn[nod] = 1;
while((1 < nod) && (arb[nod] < arb[nod / 2])){
aux = arb[nod];
arb[nod] = arb[nod / 2];
arb[nod / 2] = aux;
poz[revpoz[nod]] = nod / 2;
poz[revpoz[nod / 2]] = nod;
aux = revpoz[nod];
revpoz[nod] = revpoz[nod / 2];
revpoz[nod / 2] = aux;
nrn[nod / 2]++;
nod /= 2;
}
while(1 < nod){
nrn[nod / 2]++;
nod /= 2;
}
}
void minusnrn(int nod){
while(1 <= nod){
nrn[nod]--;
nod /= 2;
}
}
void sterge(int i, int n){
int nod, el;
nod = poz[i];
nod *= 2;
if(arb[nod + 1] < arb[nod]){
nod++;
}
while(arb[nod] != INF){
nrn[nod / 2]--;
arb[nod / 2] = arb[nod];
poz[revpoz[nod]] = nod / 2;
revpoz[nod / 2] = revpoz[nod];
nod = nod * 2;
if(arb[nod + 1] < arb[nod]){
nod++;
}
}
arb[nod / 2] = INF;
nrn[nod / 2]--;
}
int main()
{
FILE *fin, *fout;
int n, i, op, val, j, put, nrel;
fin = fopen("heapuri.in", "r");
fscanf(fin, "%d", &n);
put = 1;
while(put <= n){
put *= 2;
}
for(i = 0; i <= put; i++){
arb[i] = INF;
}
j = 0;
nrel = 0;
fout = fopen("heapuri.out", "w");
for(i = 0; i < n; i++){
fscanf(fin, "%d", &op);
if(op == 1){
fscanf(fin, "%d", &v[j]);
nrel++;
adauga(j, v[j], nrel);
j++;
}else if(op == 2){
fscanf(fin, "%d", &val);
sterge(val - 1, nrel);
minusnrn(poz[val - 1] / 2);
nrel--;
}else{
fprintf(fout, "%d\n", arb[1]);
}
}
fclose(fin);
fclose(fout);
return 0;
}