Pagini recente » Cod sursa (job #2036200) | Cod sursa (job #333344) | Cod sursa (job #1411432) | Cod sursa (job #1768997) | Cod sursa (job #552449)
Cod sursa(job #552449)
#include <cstdio>
#define N 200000
int n, nr, p;
int heap[2*N], v[N], u[N];
void swap (int &a, int &b)
{
a=a+b;
b=a-b;
a=a-b;
}
void baga (int x)
{
heap[p]=x;
int i=p;
while (heap[i]<heap[i/2])
{
swap (heap[i], heap[i/2]);
swap (v[u[i]], v[u[i/2]]);
swap (u[i], u[i/2]);
i/=2;
}
}
void scoate (int poz)
{
swap (heap[poz], heap[p]);
swap (v[u[poz]], v[u[p]]);
swap (u[poz], u[p]);
p--;
int i=poz;
while (heap[i]<heap[i/2])
{
swap (heap[i], heap[i/2]);
swap (v[u[i]], v[u[i/2]]);
swap (u[i], u[i/2]);
i/=2;
}
while (heap[i]>heap[2*i]&&2*i<=p||heap[i]>heap[2*i+1]&&2*i+1<=p)
if (heap[i]>heap[2*i])
{
swap (heap[i], heap[i*2]);
swap (v[u[i]], v[u[i*2]]);
swap (u[i], u[i*2]);
i*=2;
}
else
{
swap (heap[i], heap[i*2+1]);
swap (v[u[i]], v[u[i*2+1]]);
swap (u[i], u[i*2+1]);
i=2*i+1;
}
}
void read()
{
freopen ("heapuri.in","r",stdin);
freopen ("heapuri.out","w",stdout);
scanf ("%d",&n);
int cod, x;
while (n--)
{
scanf ("%d", &cod);
if (cod==1)
{
scanf ("%d",&x);
v[++nr]=++p;
u[p]=nr;
baga(x);
}
if (cod==2)
{
scanf ("%d", &x);
scoate (v[x]);
}
if (cod==3)
printf ("%d\n", heap[1]);
}
}
int main()
{
read();
return 0;
}