Pagini recente » Cod sursa (job #1661607) | Cod sursa (job #1575304) | Cod sursa (job #868450) | Cod sursa (job #232463) | Cod sursa (job #338702)
Cod sursa(job #338702)
/*
P[i] - Pozitia elementului intrat al i-lea
H[i] - Indicele elementului i in heap
C[i] - Cheia elementului i in heap
*/
#include <cstdio>
#define N 200001
int P[N],H[N],C[N];
void down(int tata, int n)
{
int fiu=tata<<1,val=H[tata];
if (fiu<n && C[H[fiu+1]]<C[H[fiu]]) fiu++;
while (fiu<=n && C[val]>C[H[fiu]])
{
H[tata]=H[fiu];
P[H[tata]]=tata;
tata=fiu; fiu<<=1;
if (fiu<n && C[H[fiu+1]]<C[H[fiu]]) fiu++;
}
H[tata]=val;
P[H[tata]]=tata;
}
void up(int fiu)
{
int tata=fiu>>1,val=H[fiu];
while (tata && C[val]<C[H[tata]])
{
H[fiu]=H[tata];
P[H[fiu]]=fiu;
fiu=tata; tata>>=1;
}
H[fiu]=val;
P[H[fiu]]=fiu;
}
int main()
{
int n=0,m,op,x,i,kont=0;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&m);
while (m--)
{
scanf("%d",&op);
if (op==3) printf("%d\n",C[H[1]]);
else
{
scanf("%d",&x);
if (op==1) //introduc un element nou
{
n++; kont++;
H[n]=kont;
P[kont]=n;
C[kont]=x;
up(n);
}
else
if (op==2) //scot elementul intrat al x-lea in heap
{
H[P[x]]=H[n--];
P[H[P[x]]]=P[x];
if (C[H[P[x]]]<C[H[P[x]>>1]]) up(P[x]);
else down(P[x],n);
}
}
}
return 0;
}