Pagini recente » Cod sursa (job #2010643) | Istoria paginii runda/dddhxgdxnch | Istoria paginii runda/pre-oji2014 | Istoria paginii runda/hk/clasament | Cod sursa (job #2521838)
#include <cstdio>
using namespace std;
const int NMAX = 200000;
int poz[NMAX + 5] , n , cnt;
struct heap
{
int key , ind;
};
heap h[NMAX + 5];
inline void insertheap(int val)
{
int tata , fiu;
heap aux;
n ++;
cnt ++;
fiu = n;
h[n].key = val;
h[n].ind = cnt;
poz[cnt] = n;
while(fiu > 1)
{
tata = fiu / 2;
if(h[fiu].key < h[tata].key)
{
poz[h[tata].ind] = fiu;
poz[h[fiu].ind] = tata;
aux = h[tata];
h[tata] = h[fiu];
h[fiu] = aux;
fiu = tata;
}
else
break;
}
}
inline void deleteheap(int ind)
{
int tata , fiu;
heap aux;
tata = poz[ind];
h[tata] = h[n];
poz[h[tata].ind] = tata;
n --;
while(tata <= n / 2)
{
fiu = 2 * tata;
if(fiu + 1 <= n && h[fiu].key > h[fiu + 1].key)
fiu ++;
if(h[tata].key > h[fiu].key)
{
poz[h[tata].ind] = fiu;
poz[h[fiu].ind] = tata;
aux = h[tata];
h[tata] = h[fiu];
h[fiu] = aux;
tata = fiu;
}
else
break;
}
}
inline int getmin()
{
return h[1].key;
}
int main()
{
freopen("heapuri.in" , "r" , stdin);
freopen("heapuri.out" , "w" , stdout);
int m , i , p , x , j;
scanf("%d" , &m);
for(i = 1 ; i <= m ; i ++)
{
scanf("%d" , &p);
if(p == 1)
{
scanf("%d" , &x);
insertheap(x);
}
else if(p == 2)
{
scanf("%d" , &x);
deleteheap(x);
}
else
printf("%d\n" , getmin());
}
return 0;
}