Pagini recente » Cod sursa (job #1161150) | Cod sursa (job #2792209) | Cod sursa (job #2830903) | Cod sursa (job #2131965) | Cod sursa (job #1363461)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[200001],poz[200001],poz1[200001];
void coboara(int k)
{
if(k<<1>n) return;
int j=k<<1;
if(j+1<n) if(a[j+1]<a[j]) ++j;
while(a[k]>a[j])
{
swap(a[k],a[j]);
swap(poz1[k],poz1[j]);
swap(poz[poz1[k]],poz[poz1[j]]);
k=j;
if(k<<1>n) return;
j=k<<1;
if(j+1<n) if(a[j+1]<a[j]) ++j;
}
}
void urca(int k)
{
while(k>1&&a[k]<a[k>>1])
{
swap(a[k],a[k>>1]);
swap(poz1[k],poz1[k>>1]);
swap(poz[poz1[k]],poz[poz1[k>>1]]);
k>>=1;
}
}
void sterge(int k)
{
swap(a[k],a[n]);
poz[poz1[n]]=k;
--n;
if(k>1) {if(a[k]<a[k>>1]) urca(k);}
else coboara(k);
}
void adauga(int x)
{
a[++n]=x;
poz[n]=n;
poz1[n]=n;
urca(n);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int t,o,p;
scanf("%d",&t);
while(t)
{
--t;
scanf("%d",&o);
if(o==1)
{
scanf("%d",&p);
adauga(p);
}
if(o==2)
{
scanf("%d",&p);
sterge(poz[p]);
}
if(o==3)
{
printf("%d\n",a[1]);
}
}
return 0;
}