Pagini recente » Cod sursa (job #2735988) | Cod sursa (job #2422011) | Cod sursa (job #2225423) | Cod sursa (job #2304293) | Cod sursa (job #258336)
Cod sursa(job #258336)
#include <stdio.h>
#define SIZE_H 200005
int HEAP[SIZE_H];
int HEAP_POS[SIZE_H];
int HEAP_VAL[SIZE_H];
int HEAP_N;
int T;
int N;
int ih(int val)
{
int tmp, pos;
HEAP_N++; T++;
HEAP_VAL[T] = val;
HEAP[HEAP_N] = T;
HEAP_POS[T] = HEAP_N;
pos = HEAP_N;
while(pos > 1 && HEAP_VAL[HEAP[pos]] < HEAP_VAL[HEAP[pos/2]])
{
tmp = HEAP[pos];
HEAP[pos] = HEAP[pos/2];
HEAP[pos/2] = tmp;
HEAP_POS[HEAP[pos]] = pos;
HEAP_POS[HEAP[pos/2]] = pos/2;
pos /= 2;
}
}
int sh(int heap_pos)
{
HEAP[HEAP_POS[heap_pos]] = HEAP[HEAP_N];
HEAP_POS[HEAP[HEAP_POS[heap_pos]]] = HEAP_POS[heap_pos];
int tmp, tmp2, pos = HEAP_POS[heap_pos];
HEAP_N--;
HEAP_POS[heap_pos] = 0;
while(pos < HEAP_N)
{
if(pos*2 <= HEAP_N && HEAP_VAL[HEAP[pos]] > HEAP_VAL[HEAP[pos*2]])
{
tmp = pos*2;
}
else
{
tmp = pos;
}
if(pos*2+1 <= HEAP_N && HEAP_VAL[HEAP[tmp]] > HEAP[HEAP[pos*2+1]])
{
tmp = pos*2+1;
}
if(pos != tmp)
{
tmp2 = HEAP[pos];
HEAP[pos] = HEAP[tmp];
HEAP[tmp] = tmp2;
HEAP_POS[HEAP[pos]] = pos;
HEAP_POS[HEAP[tmp]] = tmp;
pos = tmp;
}
else
{
pos = HEAP_N;
}
}
}
int main()
{
int i, j, tmp, tmpx;
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &N);
for(i=1; i<=N; i++)
{
scanf("%d", &tmp);
switch(tmp)
{
case 3:
{
printf("%d\n", HEAP_VAL[HEAP[1]]);
break;
}
case 2:
{
scanf("%d", &tmpx);
sh(tmpx);
break;
}
case 1:
{
scanf("%d", &tmpx);
ih(tmpx);
break;
}
}
}
return 0;
}