Cod sursa(job #782706)
#include<stdio.h>
#define MAX 200001
using namespace std;
FILE *f , *g ;
int h[MAX] , p[MAX] , x[MAX] , n , tip , a , q;
void down(int i);
void up(int i);
void swap( int &a , int &b)
{
int aux = a;
a = b;
b = aux;
}
int main()
{
f=fopen("heapuri.in" , "r" );
g=fopen("heapuri.out" , "w");
fscanf(f , "%d" , &n );
for( int i = 1; i <= n ; ++i )
{
fscanf(f , "%d" , &tip );
if(tip == 1)
{
fscanf(f , "%d" , &a);
h[++q] = a;
p[++p[0]] = q;
x[q] = p[0];
up(q);
}
else
if(tip == 2)
{
fscanf(f , "%d" , &a );
int aux = p[a];
swap(h[p[a]],h[q]);
int aux1 = x[q];
swap(x[p[a]],x[q]);
swap(p[a],p[aux1]);
q--;
down(aux);
}
else
if(tip == 3)
{
fprintf(g , "%d\n" , h[1]);
}
}
fclose(f);
fclose(g);
return 0;
}
void down(int i)
{
int min = i;
if(2*i <= q && h[i] > h[2*i])
min = 2*i;
if(2*i+1 <= q && h[min] > h[2*i+1])
min = 2*i+1;
if(min != i)
{
swap(h[i],h[min]);
swap(x[i],x[min]);
swap(p[x[i]],p[x[min]]);
down(min);
}
}
void up(int i)
{
if(i/2 && h[i/2] > h[i])
{
swap(h[i] , h[i/2]);
swap(x[i] , x[i/2]);
swap(p[x[i]] , p[x[i/2]]);
up(i/2);
}
}