Pagini recente » Cod sursa (job #612036) | Cod sursa (job #315844) | Cod sursa (job #1877302) | Cod sursa (job #107540) | Cod sursa (job #539345)
Cod sursa(job #539345)
// Problema "heapuri" infoarena
#include <stdio.h>
#include <stdlib.h>
#define N 200001
#define T ((i)>>1)
#define L ((i)<<1)
#define R (L+1)
int n,tip,x,nh,nr_insert,k;
int H[N], poz[N],pos[N];
inline void swap(int i, int j)
{int t=H[i]; H[i]=H[j]; H[j]=t;
t=poz[i]; poz[i]=poz[j]; poz[j]=t;
pos[poz[i]]=i;
pos[poz[j]]=j;
}
inline void upheap(int i)
{if(i>1 && H[i] < H[T]) {swap(i, T); upheap(T);}}
inline void downheap(int i)
{int m=i;
if(L<=nh) if(H[L] < H[m]) m=L;
if(R<=nh) if(H[R] < H[m]) m=R;
if(m!=i) {swap(i, m); downheap(m);}
}
void insertheap(int i)
{nh++; H[nh]=i; poz[nh]=++nr_insert; pos[nr_insert]=nh; upheap(nh);}
int main()
{freopen("heapuri.in", "r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d", &n);
while(n--)
{scanf("%d", &tip);
if(tip!=3) scanf("%d", &x);
switch(tip)
{case 1 : insertheap(x); break;
case 2: {k=pos[x]; swap(k, nh--); downheap(k);} break;
case 3: printf("%d\n", H[1]);
}
}
return 0;
}