int n;
int a[maxn];
void down(int p)
{
int l = p * 2;
int r = p * 2 + 1;
int t = p;
if (t <= n && a[l] > a[t])
t = l;
if (t <= n && a[r] > a[t])
t = r;
if (t != p)
{
swap(a[t], a[p]);
down(t);
}
}
void up(int p)
{
while (p > 1)
{
if (a[p] > a[p / 2])
{
swap(a[p], a[p / 2]);
p /= 2;
}
else
break;
}
}
void build()
{
for (int i = n / 2; i >= 1; i--)
down(i);
}
void insert(int val)
{
n++;
a[n] = val;
up(n);
}
int top()
{
return a[1];
}
void pop()
{
a[1] = a[n];
n--;
down(1);
}
void remove(int k)
{
a[k] = a[n];
n--;
up(k);
down(k);
}