Pagini recente » Cod sursa (job #1686420) | Cod sursa (job #966721) | Cod sursa (job #1367110) | Monitorul de evaluare | Cod sursa (job #452376)
Cod sursa(job #452376)
#include<stdlib.h>
#include<cstdio>
#include<algorithm>
using namespace std;
int h[200005],n,poz,ind[200005],a[200005];
int tata(int nod)
{
return nod / 2;
}
int fiust(int nod)
{
return nod * 2;
}
int fiudr(int nod)
{
return nod * 2 + 1;
}
int max()
{
return h[1];
}
void swap(int &x, int &y)
{int aux;
aux = x;
x = y;
y = aux;
}
void sift( int k)
{int son;
do
{
son = 0;
if (fiust(k) <= n)
{
son = fiust(k);
if (fiudr(k) <= n && h[fiust(k)] > h[fiudr(k)])
son = fiudr(k);
}
if (h[son] >= h[k]) son = 0;
if (son)
{
swap(h[k],h[son]);
// poz[h[son]] = k;
k = son;
// poz[h[k]] = k;
}
}while (son);
}
void perc( int k)
{int key;
key = h[k];
while (k > 1 && key < h[tata(k)])
{
h[k] = h[tata(k)];
// poz[tata(k)] = k;
k = tata(k);
}
h[k] = key;
//poz[key] = k;
}
void buildheap()
{
for (int i = n / 2; i > 0; i--)
sift(i);
}
void elimin( int k)
{
h[k] = h[n];
--n;
if (k > 1 && h[k] < h[tata(k)]) perc(k);
else sift(k);
}
void ins( int k)
{
h[++n] = k;
perc(n);
}
int main()
{int ct;
int x,y,i,m;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
ct = 1;
scanf("%d",&m);
for (i = 1; i <= m; i++)
{
x = 0;
scanf("%d",&x);
if (x == 1) { scanf("%d",&y);
a[ct] = y;
ct++;
//poz[a[ct]] = ct++;
ins(y);
}
if (x == 2) { scanf("%d",&y);
for (i = 1; i <= n; i++)
if (h[i] == a[y]) {poz = i;break;}
elimin(poz);//[a[y]]);
}
if (x == 3) {printf("%d ",max());
printf("\n");}
}
return 0;
}