Pagini recente » Cod sursa (job #586221) | Cod sursa (job #2678576) | Cod sursa (job #846275) | Cod sursa (job #3292478) | Cod sursa (job #3252823)
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct heap
{
int val, poz_cit;
}h[200005];
int v_poz[200005], nr_nod;
void my_swap(int nod_1, int nod_2)
{
swap(v_poz[h[nod_1].poz_cit], v_poz[h[nod_2].poz_cit]);
swap(h[nod_1], h[nod_2]);
}
void up(int nod)
{
while(h[nod].val < h[nod/2].val && nod > 1)
{
my_swap(nod, nod/2);
nod /= 2;
}
}
void down(int nod)
{
while(nod*2 <= nr_nod)
{
int fiu_min = nod*2;
if(nod*2+1 <= nr_nod && h[nod*2].val > h[nod*2+1].val)
{
fiu_min = nod*2+1;
}
if(h[nod].val > h[fiu_min].val)
{
my_swap(nod, fiu_min);
nod = fiu_min;
} else
{
break;
}
}
}
void add(int nr, int poz)
{
nr_nod++;
h[nr_nod].val = nr;
h[nr_nod].poz_cit = poz;
v_poz[poz] = nr_nod;
up(nr_nod);
}
void del(int poz)
{
int nod = v_poz[poz];
if(v_poz[poz] == nr_nod)
{
nr_nod--;
return;
}
my_swap(v_poz[poz], nr_nod);
nr_nod--;
up(nod);
down(nod);
}
int main()
{
int n, i, operatie, nr, poz;
in >> n;
for(i = 1; i <= n; i++)
{
in >> operatie;
if(operatie == 1)
{
in >> nr;
add(nr, i);
continue;
}
if(operatie == 2)
{
in >> poz;
del(poz);
continue;
}
out << h[1].val << '\n';
}
return 0;
}