Pagini recente » Cod sursa (job #2659982) | Cod sursa (job #72981) | Cod sursa (job #1115378) | Cod sursa (job #2194103) | Cod sursa (job #393720)
Cod sursa(job #393720)
#include<stdio.h>
#define Nmax 200010
int h[Nmax],v[Nmax],l[Nmax],K,Q,N,o=0;
int tata(int k)
{
return (k/2);
}
int fiu1(int k)
{
return 2*k;
}
int fiu2(int k)
{
return 2*k+1;
}
void swap(int x,int y)
{
int aux;
aux=h[x];
h[x]=h[y];
h[y]=aux;
v[h[x]]=x;
v[h[y]]=y;
}
void afis(int q)
{
for(int i=1;i<=K;++i)
printf("%d ",l[h[i]]);
printf("\n");
for(int i=1;i<=q;++i)
printf("%d ",v[i]);
printf("\n");
}
int up_heap(int k)
{//afis();
if(k==1)
return 0;
int t;
t=tata(k);
if(l[h[t]]>l[h[k]])
{
swap(t,k);
up_heap(t);
}
return 0;
}
int down_heap(int k)
{//printf("%d\n",k);
int s1=fiu1(k),s2=fiu2(k);
if(s1<=K&&s2<=K)
{
if(l[h[s1]]<l[h[s2]])
{
if(l[h[k]]>l[h[s1]])
{
swap(k,s1);
down_heap(s1);
}
}
else if(s2<=K)
{
if(l[h[k]]>l[h[s2]])
{
swap(k,s2);
down_heap(s2);
}
}
}
else if(s1<=K)
{
if(l[h[k]]>l[h[s1]])
{
swap(k,s1);
down_heap(s1);
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int x,y;
scanf("%d",&N);
for(int i=1;i<=N;++i)
{//afis(o);
scanf("%d",&x);
if(x==1)
{
scanf("%d",&l[++o]);
h[++K]=o;
v[o]=K;
//printf("%d \n",K);
up_heap(K);
}
if(x==2)
{
scanf("%d",&y);
swap(v[y],K);
--K;
up_heap(v[K]);
down_heap(v[K]);
}
if(x==3)
{
printf("%d\n",l[h[1]]);
//afis();
}
}
return 0;
}