Pagini recente » Cod sursa (job #2238377) | Cod sursa (job #2361592) | Cod sursa (job #712364) | Cod sursa (job #2282340) | Cod sursa (job #852856)
Cod sursa(job #852856)
#include<stdio.h>
#include<algorithm>
using namespace std;
int k,c,n,h[200200],p[200200],ind[200200];
void swappp(int v1,int v2)
{
swap(ind[v1],ind[v2]);
p[ind[v1]]=v1; p[ind[v2]]=v2;
swap(h[v1],h[v2]);
}
void down(int nod)
{
bool ok;
do
{
ok=false;
int fiu=nod;
/** trebuie sa interschimb nodul curent cu fiul cu valoare maxima */
if(2*nod<=n && h[fiu]>h[2*nod])
{ ok=true; fiu=2*nod; }
if(2*nod+1<=n && h[fiu]>h[2*nod+1])
{ ok=true; fiu=2*nod+1; }
if(ok)
{ swappp(nod,fiu); nod=fiu; }
}while(ok);
}
void up(int nod)
{
/**interschimb nodul cu tatal lui, atata vreme cat el e mai mic decat acesta */
while(nod>1 && h[nod]<h[nod/2])
{
swappp(nod,nod/2);
nod>>=1;
}
}
void insert(int x) { h[++n]=x; p[c]=n; ind[n]=c; up(n); }
void del(int x)
{
int nod=p[x];
swappp(nod,n); n--;
up(nod);
down(nod);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&k);
int t,x;
for(int i=1;i<=k;i++)
{
scanf("%d",&t);
if(t==3)
printf("%d\n",h[1]);
else if(t==1) {scanf("%d",&x);c++;insert(x);}
else
{
scanf("%d",&x);
del(x);
}
}
return 0;
}