Pagini recente » Cod sursa (job #2502828) | Cod sursa (job #3140805) | Cod sursa (job #1371108) | Cod sursa (job #266175) | Cod sursa (job #1594000)
#include <cstdio>
using namespace std;
int cnt,n;
struct poz
{
int nr,ordin;
}v[200001];
int v_poz[200001];
void swap(int &a,int &b)
{
int c=a;
a=b;
b=c;
}
void up(int i)
{
if (v[i].nr<v[i/2].nr && i!=1)
{
swap(v[i].nr,v[i/2].nr);
swap(v[i].ordin,v[i/2].ordin);
swap(v_poz[v[i].ordin],v_poz[v[i/2].ordin]);
up(i/2);
}
}
void down(int i)
{
if (n==i*2)
{
if (v[i].nr>v[i*2].nr)
{
swap(v[i].nr,v[i*2].nr);
swap(v[i].ordin,v[i*2].ordin);
swap(v_poz[v[i].ordin],v_poz[v[i*2].ordin]);
down(i*2);
}
}
else
{
if (n>i*2)
{
int min1=v[i*2].nr,poz1=i*2;
if (min1>v[i*2+1].nr)
{
min1=v[i*2+1].nr;
poz1=i*2+1;
}
if (min1<v[i].nr)
{
swap(v[i].nr,v[poz1].nr);
swap(v[i].ordin,v[poz1].ordin);
swap(v_poz[v[i].ordin],v_poz[v[poz1].ordin]);
down(poz1);
}
}
}
}
void operatia1()
{
int x;
scanf("%d ",&x);
n++;
cnt++;
v[n].nr=x;
v[n].ordin=cnt;
v_poz[cnt]=n;
up(n);
}
void operatia2()
{
int a2;
scanf("%d ",&a2);
poz a1=v[n];
v_poz[v[n].ordin]=v_poz[a2];
n--;
v[v_poz[a2]].nr=a1.nr;
v[v_poz[a2]].ordin=a1.ordin;
down(v_poz[a2]);
}
void operatia3()
{
printf("%d\n",v[1].nr);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int m;
scanf("%d ",&m);
for (int i=1;i<=m;i++)
{
int a;
scanf("%d ",&a);
if (a==1)
operatia1();
if (a==2)
operatia2();
if (a==3)
operatia3();
}
}