Pagini recente » Borderou de evaluare (job #163399) | Borderou de evaluare (job #172017) | Borderou de evaluare (job #29892) | Borderou de evaluare (job #2470511) | Cod sursa (job #1080618)
#include <fstream>
using namespace std;
int heap[200001], pos[200001], rev[200001], n, nr, nro;
void swap(int v[],int a,int b)
{
int aux = v[a];
v[a] = v[b];
v[b] = aux;
}
void Actualizare(int NOD)
{
while (NOD/2 > 0)
{
if (heap[NOD/2] > heap[NOD])
{
swap(heap, NOD/2, NOD);
swap(pos, rev[NOD/2], rev[NOD]);
swap(rev, NOD, NOD/2);
NOD = NOD / 2;
}
else
return;
}
}
void Adaug(int NOD, int value, int aux)
{
heap[NOD] = value;
pos[aux] = NOD;
rev[NOD] = aux;
Actualizare(NOD);
}
void Cobor(int NOD)
{
int sw = 0;
while(NOD <= n)
{
if((2*NOD <= nr) && (heap[2*NOD] < heap[NOD]) && (heap[2*NOD] < heap[2*NOD + 1]) )
{
NOD = 2*NOD;
sw = 1;
}
else
if((2*NOD + 1 <= nr) && (heap[2*NOD + 1] < heap[NOD]))
{
NOD = 2*NOD + 1;
sw = 1;
}
if ((NOD/2 > 0) && (sw == 1))
{
swap(heap, NOD/2, NOD);
swap(pos, rev[NOD/2], rev[NOD]);
swap(rev, NOD, NOD/2);
sw = 0;
}
else
return;
}
}
void Remove(int NOD_pos)
{
int NOD = pos[NOD_pos];
heap[NOD] = -1;
Actualizare(NOD);
heap[1] = heap[ nr-- ];
Cobor(1);
}
int main()
{
int x, y;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f >> n;
for(int i=1; i<=n; i++)
{
f >> x;
if (x == 3)
g << heap[1] << "\n" ;
else
if( x == 1 )
{
f >> y;
Adaug(++nr, y, ++nro);
}
else
if( x == 2 )
{
f >> y;
Remove(y);
}
}
return 0;
}