Pagini recente » Cod sursa (job #230117) | Cod sursa (job #206804) | Cod sursa (job #2598447) | Cod sursa (job #328586) | Cod sursa (job #659178)
Cod sursa(job #659178)
//sdo cu heapuri
#include <cstdio>
#include <fstream>
#define fiu_stang(n) (n<<1)
#define fiu_drept(n) ((n<<1)+1)
#define DIM 8192
char ax[DIM+16];
int pz;
using namespace std;
int h[3000001];
// ifstream fin("sdo.in");
ofstream fout("sdo.out");
inline void cit(int &x)
{
x=0;
while(ax[pz]<'0' || ax[pz]>'9')
if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
while(ax[pz]>='0' && ax[pz]<='9')
{
x=x*10+ax[pz]-'0';
if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
}
}
void afis_heap(int n){
fout<<"heap ";
for (int i=1; i<=n;i++)
fout<<h[i]<<" ";
fout<<endl;
}
void cerne(int n, int k){
int fiu,x;
do {
fiu=0;
if (fiu_stang(k)<=n){
fiu = fiu_stang(k);
if (fiu_drept(k)<=n && h[fiu_drept(k)]<h[fiu_stang(k)]){
fiu=fiu_drept(k);
}
if (h[fiu]>=h[k])
fiu=0;
}
if (fiu){
x=h[k];
h[k]=h[fiu];
h[fiu]=x;
k=fiu;
}
} while (fiu);
}
void build(int n){
for (int i=n/2; i>0; i--){
cerne(n,i);
}
}
int tzipa(int k,int n){
if (k>1)
for (int i=n;k>1&&i>=2;i--){
h[1]=h[i];
cerne(i-1,1);
k--;
}
return h[1];
}
int main()
{
freopen("sdo.in","r",stdin);
int n,k;
cit(n);
cit(k);
for (int i=1; i<=n;i++){
cit(h[i]);;
}
build(n);
fout<<tzipa(k,n);
return 0;
}