Mai intai trebuie sa te autentifici.
Cod sursa(job #744858)
Utilizator | Data | 9 mai 2012 20:36:41 | |
---|---|---|---|
Problema | Heapuri | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.84 kb |
#include<cstdio>
#define NMAX 200005
#define NMAX2 100000005
using namespace std;
int H[NMAX],Ord[NMAX];
short int Idx[NMAX2];
int n,k;
inline unsigned father(unsigned nod)
{
return nod>>1;
}
inline unsigned left_son(unsigned nod)
{
return nod<<1;
}
inline unsigned right_son(unsigned nod)
{
return (nod<<1)+1;
}
void percolate(int N, int i)
{
int aux;
while(i>1 && H[i]<H[father(i)])
{
aux=Idx[H[i]];
Idx[H[i]]=Idx[H[father(i)]];
Idx[H[father(i)]]=aux;
aux=H[i];
H[i]=H[father(i)];
H[father(i)]=aux;
i=father(i);
}
}
void sift(int N, int i)
{
int aux,son;
do
{
son=0;
if(left_son(i)<=N)
{
son=left_son(i);
if(right_son(i)<=N && H[son]>H[right_son(i)])
son=right_son(i);
if(H[son]>H[i])
son=0;
}
if(son)
{
aux=Idx[H[i]];
Idx[H[i]]=Idx[H[son]];
Idx[H[son]]=aux;
aux=H[i];
H[i]=H[son];
H[son]=aux;
i=son;
}
}while(son);
}
void insert(int x)
{
n++;
k++;
H[n]=x;
Idx[x]=n;
Ord[n]=x;
percolate(n,n);
}
void cut(int x)
{
H[Idx[Ord[x]]]=H[n];
n--;
if(x>1 && H[Idx[Ord[x]]]<H[father(Idx[Ord[x]])])
percolate(n,Idx[Ord[x]]);
else
sift(n,Idx[Ord[x]]);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int op,x,m;
scanf("%d",&m);
while(m--)
{
scanf("%d",&op);
if(op==3)
printf("%d\n",H[1]);
else
{
scanf("%d",&x);
if(op==1)
insert(x);
else
cut(x);
}
}
return 0;
}