Pagini recente » Cod sursa (job #851174) | Cod sursa (job #3178569) | Cod sursa (job #1982063) | Cod sursa (job #1539569) | Cod sursa (job #539392)
Cod sursa(job #539392)
// Problema "heapuri" infoarena
// H este un min-heap
// pos[i] pozitia inserarii numarul i, in heapul H
// poz[i] numarul inserarii ce se afla pe pozitia i in heapul H
#include <stdio.h>
#include <stdlib.h>
#define N 200001
#define T ((i)>>1)
#define L ((i)<<1)
#define R (L+1)
int n,nh,nr_insert,tip,x,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)
//{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 1 : H[++nh]=x; poz[nh]=++nr_insert; pos[nr_insert]=nh; upheap(nh); break;
case 2 : k=pos[x]; swap(k, nh--); downheap(k); break;
case 3 : printf("%d\n", H[1]);
}
}
return 0;
}