Pagini recente » Cod sursa (job #2241027) | Cod sursa (job #2708147) | Cod sursa (job #1106279) | Cod sursa (job #2594724) | Cod sursa (job #351020)
Cod sursa(job #351020)
#include <fstream>
using namespace std;
#define t(x) x/2
#define fs(x) 2*x
#define fd(x) 2*x+1
#define nmax 200001
struct Heap {int p,x;} H[nmax];
int P[nmax],n,cod,nr,m,pp,z;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
void up_up(int y)
{
while(t(y)>=1 && H[y].x<H[t(y)].x)
{
swap(H[y],H[t(y)]);
P[H[y].p]=y;
P[H[t(y)].p]=t(y);
y=t(y);
}
}
void down(int y)
{
int fiu;
while(fs(y)<=m)
{
fiu=fs(y);
if(fd(y)<=m&&H[fd(y)].x<H[fs(y)].x)
fiu=fd(y);
if(H[fiu].x<H[y].x)
{
swap(H[fiu],H[y]);
P[H[fiu].p]=fiu;
P[H[y].p]=y;
y=fiu;
}
else
break;
}
}
int main()
{
f>>n;
for(int i=1;i<=n;i++)
{
f>>cod;
if(cod==1)
{
f>>H[++m].x;
H[m].p=(++nr);
P[H[m].p]=m;
if(t(m)>=1&&H[m].x<H[t(m)].x)
up_up(m);
}
else if(cod==2)
{
f>>pp;
z=P[pp];
swap(H[z],H[m]);
P[H[z].p]=z;
--m;
if(t(z)>=1&&H[t(z)].x>H[z].x)
{
up_up(z);
}
else if(fs(z)<=m)
{
down(z);
}
}
else
{
g<<H[1].x<<endl;
}
}
return 0;
}