Pagini recente » Borderou de evaluare (job #607718) | Borderou de evaluare (job #2070616) | Borderou de evaluare (job #2021164) | Borderou de evaluare (job #3149574) | Cod sursa (job #2603243)
#include <cstdio>
#include <algorithm>
using namespace std;
int nr1=0,arb[200010],v[200010],poz[200010];
void up_heap(int nod)
{
for(;nod>1 && v[arb[nod]]<v[arb[nod/2]];nod/=2)
{
swap(arb[nod],arb[nod/2]);
swap(poz[arb[nod]],poz[arb[nod/2]]);
}
}
void down_heap(int nod)
{
while((nod*2<=nr1 && v[arb[nod]]>v[arb[nod*2]]) or (nod*2+1<=nr1 && v[arb[nod]]>v[arb[nod*2+1]]))
if(nod*2+1<=nr1 && v[arb[nod*2+1]]<v[arb[nod*2]]) {swap(arb[nod],arb[nod*2+1]);swap(poz[arb[nod]],poz[arb[nod*2+1]]);nod=nod*2+1;}
else {swap(arb[nod],arb[nod*2]);swap(poz[arb[nod]],poz[arb[nod*2]]);nod=nod*2;}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int n,cod,nr=0,x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&cod);
if(cod==1) {nr1++;nr++;scanf("%d",&v[nr]);arb[nr1]=nr;poz[nr]=nr1;up_heap(nr1);}
if(cod==2) {scanf("%d",&x);arb[poz[x]]=arb[nr1];poz[arb[nr1]]=poz[x];nr1--;up_heap(poz[x]);down_heap(poz[x]);}
if(cod==3) printf("%d\n",v[arb[1]]);
}
return 0;
}