Pagini recente » Cod sursa (job #2279324) | Cod sursa (job #1049183) | Cod sursa (job #2876992) | Cod sursa (job #1659348) | Cod sursa (job #1853607)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int N,h,k,heap[200001],val[200001],poz[200001];
inline int father(int nod)
{
return heap[ poz[nod]/2 ];
}
inline int left_son(int nod)
{
return heap[ poz[nod]*2 ];
}
inline int right_son(int nod)
{
return heap[ poz[nod]*2 + 1 ];
}
void up(int nod)
{
int aux;
while( val[ nod ] < val[ father(nod) ] && father(nod) != 0 )
{
aux = father(nod);
heap[ poz[ nod ] ] = aux;
heap[ poz[ aux ] ] = nod;
poz[ aux ] = poz[ nod ];
poz[ nod ] = poz[ nod ] / 2;
}
}
void down(int nod)
{
int aux,ok=1;
while( ok == 1 )
{
if( left_son(nod) == 0 || right_son(nod) == 0 )
ok = 3;
else
if( val[ left_son(nod) ] >= val[ nod ] && val[ right_son(nod) ] >= val[ nod ] )
ok = 2;
else
{
if( val[ left_son(nod) ] < val[ right_son(nod) ] && val[ left_son(nod) ] < val[ nod ] )
{
aux = left_son(nod);
heap[ poz[ nod ] ] = aux;
heap[ poz[ aux ] ] = nod;
poz[ aux ] = poz[ nod ];
poz[ nod ] = poz[ nod ] * 2;
}
else
if( val[ right_son(nod) ] <= val[ left_son(nod) ] && val[ right_son(nod) ] < val[ nod ] )
{
aux = right_son(nod);
heap[ poz[ nod ] ] = aux;
heap[ poz[ aux ] ] = nod;
poz[ aux ] = poz[ nod ];
poz[ nod ] = poz[ nod ] * 2 + 1;
}
}
}
if( ok == 2 )
return;
if( val[ left_son(nod) ] < val[ nod ] && left_son(nod) != 0 && right_son(nod) == 0 )
{
aux = left_son(nod);
heap[ poz[ nod ] ] = aux;
heap[ poz[ aux ] ] = nod;
poz[ aux ] = poz[ nod ];
poz[ nod ] = poz[ nod ] * 2;
}
else
if( val[ right_son(nod) ] < val[ nod ] && right_son(nod) != 0 && left_son(nod) == 0 )
{
aux = right_son(nod);
heap[ poz[ nod ] ] = aux;
heap[ poz[ nod ]*2 ] = nod;
poz[ aux ] = poz[ nod ];
poz[ nod ] = poz[ nod ] * 2;
}
}
void Eliminare(int nod)
{
int aux = heap[h];
poz[ aux ] = poz[ nod ];
heap[ poz[ nod ] ] = aux;
poz[ nod ] = 0;
heap[h] = 0;
h--;
up(aux);
down(aux);
}
int main()
{
f>>N;
int a,b;
for(int i = 1 ; i <=N ; i++)
{
f>>a;
if( a == 3 )
g<<val[ heap[1] ]<<'\n';
else
if( a == 2 )
{
f>>b;
Eliminare(b);
}
else
if( a == 1 )
{
f>>b;
k++;
h++;
poz[k] = h;
val[k] = b;
heap[h] = k;
up(k);
}
}
return 0;
}