Pagini recente » Cod sursa (job #516972) | Cod sursa (job #2749892) | Cod sursa (job #118754) | Cod sursa (job #2380274) | Cod sursa (job #407288)
Cod sursa(job #407288)
#include <stdio.h>
#define Nmax 200005
int H[Nmax], poz[Nmax], v[Nmax];
int n, N, q, x, i, niv;
void swap(int i, int j){
int aux;
poz[H[i]] = j;
poz[H[j]] = i;
aux = H[i];
H[i] = H[j];
H[j] = aux;
}
int fiu_min(int i){
if (2*i+1<= niv)
if (v[H[2*i+1]] < v[H[2*i]])
return 2*i+1;
return 2*i;
}
void down (int i){
int k;
if (i <= niv/2){
k = fiu_min(i);
if (v[H[i]] > v[H[k]]){
swap(i, k);
down(k);
}
}
}
void up (int i){
int t = i/2;
if (i > 1 && v[H[i]] < v[H[t]]){
swap(i,t);
up(t);
}
}
void push(int valoare){
v[++N] = valoare;
H[++niv] = N;
poz[N] = niv;
up(niv);
}
void pop(int i){
swap (i,niv);
niv--;
down(i);
}
int main (){
FILE * f = fopen ("heapuri.in", "r");
FILE * g = fopen ("heapuri.out", "w");
fscanf(f, "%d", &n);
for (i = 1 ; i <= n ; i++){
fscanf(f, "%d", &q);
if (q == 1) {
fscanf (f, "%d", &x);
push(x);
}
if (q == 2) {
fscanf (f, "%d", &x);
pop(poz[x]);
}
if (q == 3){
fprintf(g, "%d\n", v[H[1]]);
}
}
fclose(f);
fclose(g);
return 0;
}