Pagini recente » Cod sursa (job #555801) | Cod sursa (job #2194198) | Cei mai harnici utilizatori infoarena | Cod sursa (job #2091805) | Cod sursa (job #892411)
Cod sursa(job #892411)
#include<iostream>
#include<cstdio>
#define nmax 200010
using namespace std;
struct arb
{
int nr;
int ord;
} a[nmax];
int n,x,cod,p[nmax],i,k;
void urc(int i)
{
if(i/2>=1)
{
if(a[i/2].nr>a[i].nr)
{
swap(a[i/2],a[i]);
swap(p[a[i/2].ord],p[a[i].ord]);;
urc(i/2);
}
}
}
void pop(int x)
{
int r;
a[x]=a[k--];
p[a[x].ord]=x;
while(2*x<=k)
{
int min=a[2*x].nr;
r=2*x;
if(2*x+1<=k && min>a[2*x+1].nr)
{
min=a[2*x+1].nr;
r=2*x+1;
}
if(a[x].nr>a[r].nr)
{
swap(a[x],a[r]);
swap(p[a[x].ord],p[a[r].ord]);
}
x=r;
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
{
for(i=1;i<=n;i++)
{
scanf("%d",&cod);
switch(cod)
{
case 1:
scanf("%d",&x);
a[++k].nr=x;
a[k].ord=k;
p[k]=k;
urc(k);
break;
case 2:
scanf("%d",&x);
pop(p[x]);
break;
case 3:
printf("%d\n",a[1].nr);
}
}
}
return 0;
}