Pagini recente » Cod sursa (job #910364) | Cod sursa (job #2700879) | Winter Challenge, Clasele XI - XII | Cod sursa (job #2684555) | Cod sursa (job #766646)
Cod sursa(job #766646)
#include<stdio.h>
int heap[200001], position[200001], order[200001], heapSize;
FILE *in, *out;
void up(int pos);
void down(int pos);
int main()
{
int n, op, value, pos;
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:
fscanf(in, "%d", &value);
order[ ++order[0] ] = value;
position[ value ] = ++heapSize;
heap[ heapSize ] = value;
up( heapSize );
break;
case 2:
fscanf(in, "%d", &value);
pos = position[ order[ value ] ];
heap[pos] = heap[heapSize--];
position[ heap[pos] ] = pos;
if(pos > 1 && heap[pos] < heap[pos >> 1])
up(pos);
else if(pos < heapSize)
down(pos);
break;
case 3:
fprintf(out, "%d\n", heap[1]);
break;
default:
fprintf(stderr, "input error\n");
}
}
fclose(in);
fclose(out);
return 0;
}
void down(int pos)
{
int next = pos;
if((pos << 1) <= heapSize && heap[next] > heap[pos << 1])
next = pos << 1;
if((pos << 1) + 1 <= heapSize && heap[next] > heap[(pos << 1) + 1])
next = (pos << 1) + 1;
if(next != pos)
{
heap[pos] += heap[next];
heap[next] = heap[pos] - heap[next];
heap[pos] -= heap[next];
position[heap[pos]] = pos;
position[heap[next]] = next;
down(next);
}
}
void up(int pos)
{
if(pos > 1 && heap[pos >> 1] > heap[pos])
{
heap[pos] += heap[pos >> 1];
heap[pos >> 1] = heap[pos] - heap[pos >> 1];
heap[pos] -= heap[pos >> 1];
position[heap[pos]] = pos;
position[heap[pos >> 1]] = pos >> 1;
up(pos >> 1);
}
}