#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int h[N], mySize;
int n, m;
void down(int u)
{
int t = u;
if (2 * u <= mySize && h[t] > h[2 * u])
t = 2 * u;
if (2 * u + 1 <= mySize && h[t] > h[2 * u + 1])
t = 2 * u + 1;
if (u != t)
{
swap(h[u], h[t]);
down(t);
}
}
int main()
{
cin >> n >> m;
mySize = n;
for (int i = 1; i <= n; i++)scanf("%d", &h[i]);
for (int i = n / 2; i; i--)down(i);
while (m--)
{
cout << h[1] << " ";
h[1] = h[mySize],mySize--, down(1);
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int h[N];
int ph[N];
int hp[N];
int mysize;
void heap_swap(int u,int v)
{
swap(h[u],h[v]);
swap(hp[u],hp[v]);
swap(ph[hp[u]],ph[hp[v]]);
}
void down(int u)
{
int t=u;
if(u*2<=mysize&&h[t]>h[u*2]) t=u*2;
if(u*2+1<=mysize&&h[t]>h[u*2+1]) t=u*2+1;
if(u!=t)
{
heap_swap(u,t);
down(t);
}
}
void up(int u)
{
if(u/2>0&&h[u]<h[u/2])
{
heap_swap(u,u/2);
up(u>>1);
}
}
int main()
{
int n;
cin>>n;
int m=0;
while(n--)
{
string op;
int k,x;
cin>>op;
if(op=="I")
{
cin>>x;
m++;
h[++mysize]=x;
ph[m]=mysize;
hp[mysize]=m;
up(mysize);
}
else if(op=="PM") cout<<h[1]<<endl;
else if(op=="DM")
{
heap_swap(1,mysize);
mysize--;
down(1);
}
else if(op=="D")
{
cin>>k;
int u=ph[k];
heap_swap(u,mysize);
mysize--;
up(u);
down(u);
}
else if(op=="C")
{
cin>>k>>x;
h[ph[k]]=x;
down(ph[k]);
up(ph[k]);
}
}
return 0;
}
|