Pagini recente » Cod sursa (job #960780) | Cod sursa (job #391691) | Cod sursa (job #739285) | Cod sursa (job #163717) | Cod sursa (job #1601580)
#include<cstdio>
#include<algorithm>
using namespace std;
int h[200012], n, ins[200010], poz[200010], nr, lung, cnt;
void adauga(int x)
{
int ind=lung;
while(ind>1)
{
if(h[ind]<h[ind/2])
{
swap(poz[h[ind/2]], poz[h[ind]]);
swap(h[ind], h[ind/2]);
}
//swap(ins[ind],ins[ind/2]);
ind=ind/2;
}
}
void pop(int x)
{
int ind=poz[x];
while(ind<lung)
{
if(h[2*ind]<h[2*ind+1])
{
if(h[2*ind])
{
swap(poz[h[ind]], poz[h[2*ind]]);
swap(h[ind], h[2*ind]);
ind=2*ind;
}
else
{
swap(h[ind], h[2*ind+1]);
swap(poz[h[ind]], poz[h[2*ind+1]]);
ind=2*ind+1;
}
}
else
{
if(h[2*ind+1])
{
swap(poz[h[ind]], poz[h[ind+1]]);
swap(h[ind], h[2*ind+1]);
ind=2*ind+1;
}
else
{
swap(h[ind], h[2*ind]);
swap(poz[h[ind]], poz[h[2*ind]]);
ind=2*ind;
}
}
}
poz[h[ind]]=0;
h[ind]=0;
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int x, o, i, k;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
scanf("%d", &o);
if(o!=3)
{
scanf("%d", &x);
if(o==1)
{
lung++; //crestem lungimea heap-ului
cnt++; // al catelea el introdus
ins[cnt]=x; //toate el introduse in ord cronologica
poz[x]=lung; //poz lui x in heap
h[lung]=x; // il punem pe x la sf heapului
adauga(x);
}
else
{
pop(ins[x]);
lung--;
}
}
else
{
printf("%d\n", h[1]);
}
}
return 0;
}