Pagini recente » Cod sursa (job #849202) | Cod sursa (job #3230241) | Cod sursa (job #1463133) | Cod sursa (job #2480609) | Cod sursa (job #1502424)
#include <stdio.h>
struct heap {
int tree[200000];
int insertrank[200000];
int insertno;
int end;
} heap;
void initheap(void)
{
int i;
for (i = 0; i < 200000; ++i) {
heap.tree[i] = heap.insertrank[i] = -1;
}
heap.end = heap.insertno = -1;
}
void heap_add(int newitem)
{
int itempos = ++heap.end;
heap.insertrank[itempos] = ++heap.insertno;
heap.tree[itempos] = newitem;
int parent = (itempos - 1) / 2;
int aux = 1;
while (aux) {
aux = 0;
if (heap.tree[itempos] < heap.tree[parent]) {
aux = heap.tree[itempos];
heap.tree[itempos] = heap.tree[parent];
heap.tree[parent] = aux;
aux = heap.insertrank[itempos];
heap.insertrank[itempos] = heap.insertrank[parent];
heap.insertrank[parent] = aux;
itempos = parent;
parent = (itempos - 1) / 2;
aux = 1;
}
}
}
void heap_del(int insitmno)
{
int itempos, i;
for (i = 0; i <= heap.end; ++i) {
if (insitmno == heap.insertrank[i]) {
itempos = i;
}
}
heap.tree[itempos] = heap.tree[heap.end--];
int left, right, aux, smallest = 1;
while (smallest) {
left = 2 * itempos + 1;
right = left + 1;
if (heap.tree[left] < heap.tree[right]) {
smallest = left;
} else {
smallest = right;
}
if (heap.tree[smallest] < heap.tree[itempos] && smallest <= heap.end) {
aux = heap.tree[itempos];
heap.tree[itempos] = heap.tree[smallest];
heap.tree[smallest] = aux;
aux = heap.insertrank[itempos];
heap.insertrank[itempos] = heap.insertrank[smallest];
heap.insertrank[smallest] = aux;
itempos = smallest;
smallest = 1;
} else {
smallest = 0;
}
}
}
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 - 1);
break;
case 3:
fprintf(out, "%d\n", heap.tree[0]);
break;
}
}
fclose(in);
fclose(out);
return 0;
}