Pagini recente » Cod sursa (job #964984) | Cod sursa (job #1297134) | Cod sursa (job #1192958) | Cod sursa (job #988854) | Cod sursa (job #1812892)
#include <stdio.h>
#define MAXN 200010
int k = 0, poz[MAXN]; //poz[i] ---> pozitia pe care se afla elementul adaugat al i-lea
struct heap{
int val,pozi;
};
struct heap my_heap[MAXN];
//my_heap[i].val ----> valoarea elementului i
//my_heap[i].pozi ----> al catelea element a fost adaugat
void heapUp(int k){
int i = k;
struct heap aux;
while(my_heap[i].val < my_heap[i / 2].val && i > 1){
poz[my_heap[i].pozi] = i / 2;
poz[my_heap[i / 2].pozi] = i;
aux = my_heap[i];
my_heap[i] = my_heap[i / 2];
my_heap[i / 2] = aux;
i = i / 2;
}
}
void heapDown(int x){
int i = x;
struct heap aux;
while((my_heap[i].val > my_heap[i * 2].val && i * 2 <= k) || (my_heap[i].val > my_heap[i * 2 + 1].val && (i * 2 + 1) <= k)){
if(my_heap[2 * i].val > my_heap[2 * i + 1].val && 2 * i + 1 <= k){
poz[my_heap[i].pozi] = 2 * i + 1;
poz[my_heap[i * 2 + 1].pozi] = i;
aux = my_heap[2 * i + 1];
my_heap[2 * i + 1] = my_heap[i];
my_heap[i] = aux;
i = i * 2 + 1;
}
else{
poz[my_heap[i].pozi] = 2 * i;
poz[my_heap[i * 2].pozi] = i;
aux = my_heap[2 * i];
my_heap[2 * i] = my_heap[i];
my_heap[i] = aux;
i = i * 2;
}
}
}
int main(){
FILE *f, *g;
f=fopen("heapuri.in","r");
g=fopen("heapuri.out","w");
int i, n, mod, x, count = 0;
fscanf(f,"%d",&n);
for(i = 1;i <= n; ++i){
fscanf(f,"%d",&mod);
if(mod == 1){
fscanf(f,"%d",&x);
++k;
++count;
my_heap[k].val = x;
my_heap[k].pozi = count;
poz[count] = k;
heapUp(k);
}
if(mod == 2){
fscanf(f,"%d",&x);
my_heap[poz[x]].val = my_heap[k].val;
my_heap[poz[x]].pozi = my_heap[k].pozi;
poz[my_heap[k].pozi] = poz[x];
--k;
heapDown(poz[x]);
}
if(mod == 3)
fprintf(g,"%d\n",my_heap[1].val);
}
return 0;
}