Pagini recente » Cod sursa (job #2265361) | Cod sursa (job #380106) | Cod sursa (job #1419309) | Cod sursa (job #508127) | Cod sursa (job #1502243)
#include <stdio.h>
struct heap {
int tree[200000];
int end;
} heap;
int insertorder[200000];
const int heaproot = 0;
int insertno = -1;
void initheap(void)
{
int i;
for (i = 0; i < 200000; ++i) {
heap.tree[i] = -1;
}
heap.end = -1;
}
void heap_add(int newitem)
{
int itempos = ++heap.end;
insertorder[++insertno] = heap.end;
heap.tree[itempos] = newitem;
int parent = (itempos - 1) / 2;
int aux;
while (itempos != heaproot) {
if (heap.tree[itempos] < heap.tree[parent]) {
aux = heap.tree[itempos];
heap.tree[itempos] = heap.tree[parent];
heap.tree[parent] = aux;
} else {
break;
}
itempos = parent;
parent = (itempos - 1) / 2;
}
}
void heap_del(int insitmno)
{
int itempos = insertorder[insitmno];
heap.tree[itempos] = heap.tree[heap.end--];
int i, parentno, left, right, aux;
parentno = (i + 1) / 2;
for (i = 0; i < parentno; ++i) {
left = 2 * i + 1;
right = left + 1;
if (heap.tree[left] < heap.tree[right]) {
if (heap.tree[i] > heap.tree[left]) {
aux = heap.tree[i];
heap.tree[i] = heap.tree[left];
heap.tree[left] = aux;
}
} else if (heap.tree[i] > heap.tree[right]) {
aux = heap.tree[i];
heap.tree[i] = heap.tree[right];
heap.tree[right] = aux;
}
}
}
int main(void)
{
initheap();
int N;
FILE *in = fopen("heapuri.in", "r");
FILE *out = fopen("heapuri.out", "w");
fscanf(in, "%d", &N);
int i, op, aux;
for (i = 0; i < N; ++i) {
fscanf(in, "%d", &op);
switch (op) {
case 1:
fscanf(in, "%d", &aux);
heap_add(aux);
break;
case 2:
fscanf(in, "%d", &aux);
heap_del(aux);
break;
case 3:
fprintf(out, "%d\n", heap.tree[0]);
break;
}
}
fclose(in);
fclose(out);
return 0;
}