Pagini recente » Cod sursa (job #2790093) | Cod sursa (job #115136) | Cod sursa (job #1501515) | Cod sursa (job #2740767) | Cod sursa (job #710432)
Cod sursa(job #710432)
#include <cstdio>
using namespace std;
int n, heap[5000001], ord[5000001], k, m;
inline int tata(int n)
{
return n>>1;
}
void percolate(int nr, int m)
{
while(heap[tata(m)]>nr && m>1)
{
heap[m]=heap[tata(m)];
m/=2;
}
heap[m]=nr;
}
void sift(int nr, int m)
{
int fiu, temp;
do
{
fiu=0;
if(nr*2<=m) fiu=nr*2;
if(nr*2+1<=m && heap[nr*2+1]<heap[nr*2]) fiu=nr*2+1;
if(heap[fiu]>heap[nr]) fiu=0;
if(fiu)
{
temp=heap[fiu];
heap[fiu]=heap[nr];
heap[nr]=temp;
nr=fiu;
}
}while(fiu);
}
int cautare(int nr, int nod)
{
for(int i=1; i<=m; i++)
if(nr==heap[i])
return i;
}
void stergere(int nod, int &m)
{
heap[nod]=heap[m];
m--;
if (nod > 1 && heap[tata(nod)]>heap[nod])
percolate(heap[nod], m);
else
sift(nod, m);
}
void prelucr()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out","w",stdout);
scanf("%d", &n);
int t,nr;
while(n)
{
n--;
scanf("%d", &t);
switch(t)
{
case 1:
{
scanf("%d", &nr);
heap[++m]=nr;
percolate(nr, m);
ord[++k]=nr;
break;
}
case 2:
{
scanf("%d", &nr);
nr=ord[nr];
stergere(cautare(nr, 1), m);
break;
}
case 3:
printf("%d\n", heap[1]);
}
}
}
int main()
{
prelucr();
return 0;
}