Pagini recente » Cod sursa (job #2132295) | Cod sursa (job #323855) | Cod sursa (job #207695) | Cod sursa (job #2923254) | Cod sursa (job #2892454)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct elem
{
int val;
int init;
int crt;
};
elem h[200001], poz[200001];
int n, op, crt, nr=0, m=0;
void schimbare(int p1, int p2)
{
//interschimbare elemente
elem aux = h[p1];
h[p1] = h[p2];
h[p2] = aux;
//schimbare pozitii curente
h[p1].crt=poz[h[p1].init].crt=p1;
h[p2].crt=poz[h[p2].init].crt=p2;
}
void inserare(elem nou)
{
int pozitie=nou.crt;
h[pozitie]=nou;
poz[nou.init]=nou;
while(pozitie/2>=0 && h[pozitie].val<h[pozitie/2].val)
{
schimbare(pozitie, pozitie/2);
pozitie=pozitie/2;
}
}
void stergere(int nr, elem e)
{
int pozitie=e.crt;
schimbare(pozitie, nr-1);
nr--;
while(pozitie*2<=nr-1)
{
int c1=pozitie*2;
if(pozitie*2+1<=nr-1)
{
int c2=pozitie*2+1;
if(h[pozitie].val<h[c1].val && h[pozitie].val<h[c2].val)
break;
if(h[c1].val<=h[c2].val)
{
schimbare(pozitie, c1);
pozitie=c1;
}
else
{
schimbare(pozitie, c2);
pozitie=c2;
}
}
else
{
if(h[pozitie].val<=h[c1].val)
break;
schimbare(pozitie, c1);
pozitie=c1;
}
}
}
int main()
{
in>>n;
for(int i=0; i<n; i++)
{
in>>op;
switch(op)
{
case 1:
in>>crt;
elem nou;
nou.val=crt;
nou.init=m;
nou.crt=nr;
inserare(nou);
nr++;
m++;
break;
case 2:
in>>crt;
stergere(nr, poz[crt-1]);
nr--;
break;
default:
out<<h[0].val<<'\n';
break;
}
}
return 0;
}