Pagini recente » Cod sursa (job #2104419) | Cod sursa (job #28403) | Cod sursa (job #834289) | Cod sursa (job #2039081) | Cod sursa (job #766681)
Cod sursa(job #766681)
#include<stdio.h>
int heap[200001], heapSize, v[200001], nr, position[200001];
void up(int pos)
{
int root = pos >> 1;
while(pos > 1 && v[ heap[root] ] > v[ heap[pos] ])
{
heap[root] += heap[pos];
heap[pos] = heap[root] - heap[pos];
heap[root] -= heap[pos];
position[ heap[root] ] = root;
position[ heap[pos] ] = pos;
pos >>= 1;
root >>= 1;
}
}
void down(int pos)
{
int next = pos;
do {
pos = next;
if((pos << 1) <= heapSize && v[ heap[next] ] > v[ heap[pos << 1] ])
next = pos << 1;
if((pos << 1) + 1 <= heapSize && v[ heap[next] ] > v[ heap[(pos << 1) + 1]])
next = (pos << 1) + 1;
if(pos != next)
{
heap[pos] += heap[next];
heap[next] = heap[pos] - heap[next];
heap[pos] -= heap[next];
position[ heap[pos] ] = pos;
position[ heap[next] ] = next;
}
} while(pos != next);
}
int main()
{
FILE *in, *out;
int op, value, order, N;
int i, j, k;
in = fopen("heapuri.in", "r");
out = fopen("heapuri.out", "w");
for(fscanf(in, "%d", &N); N; --N)
{
fscanf(in, "%d", &op);
switch(op)
{
case 1:/* insert */
fscanf(in, "%d", &value);
v[++nr] = value;
position[nr] = ++heapSize;
heap[heapSize] = nr;
up(heapSize);
break;
case 2:/* delete */
fscanf(in, "%d", &order);
heap[ position[order] ] = heap[heapSize];
position[ heap[heapSize--] ] = position[order];
down( position[order] );
up( position[order] );
break;
case 3:/* print minimum */
fprintf(out, "%d\n", v[ heap[1] ]);
break;
default:
fprintf(stderr, "input error!\n");
}
}
fclose(in);
fclose(out);
return 0;
}