Pagini recente » Cod sursa (job #844113) | Cod sursa (job #283196) | Cod sursa (job #2675830) | Cod sursa (job #3123713) | Cod sursa (job #1239267)
#include <cstdio>
#include <algorithm>
using namespace std;
struct da
{
int val,poz;
};
da a[200000];
int n,instr,com,poz[200000],i,x,xx;
void swapp(int pozz)
{
swap(poz[a[pozz].poz],poz[a[2*pozz].poz]);
swap(a[pozz],a[2*pozz]);
}
void heapup(int n)
{
if (n<=1) return ;
if (a[n/2].val>a[n].val)
{
swapp(n/2);
heapup(n/2);
}
}
void heapdown(int n,int r)
{
int st,dr;
if (2*r<=n)
{
st=a[2*r].val;
if (2*r+1<=n)dr=a[2*r+1].val;
else dr=-1;
if (st<dr||(st>dr&&dr==-1))
{
if (a[2*r].val<a[r].val)
{
swapp(r);
heapdown(n,2*r);
}
}
else if (st>dr&&dr!=-1)
{
if (a[2*r+1].val<a[r].val)
{
//swapp(a[2*r+1],a[r]);
swap(poz[a[r].poz],poz[a[2*r+1].poz]);
swap(a[r],a[2*r+1]);
heapdown(n,2*r+1);
}
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d ",&instr);
for (i=1; i<=instr; i++)
{
scanf("%d ",&com);
if (com==1)
{
scanf("%d ",&x);
a[++n].val=x;
a[n].poz=n;
poz[n]=n;
heapup(n);
}
else if (com==2)
{
scanf("%d ",&x);
xx=poz[x];
swap(poz[x],poz[a[n].poz]);
swap(a[xx],a[n]);
n--;
heapdown(n,xx);
}
else if (com==3)
{
printf("%d\n",a[1]);
}
}
return 0;
}