Pagini recente » Cod sursa (job #59170) | Cod sursa (job #2808425) | Cod sursa (job #2965819) | Cod sursa (job #2666207) | Cod sursa (job #2217503)
#include <bits/stdc++.h>
using namespace std;
#define DIM 10000
int poz = 0;
char buff[DIM];
void cit(int &n){
n = 0;
while(buff[poz] < '0' || buff[poz] > '9'){
if(++poz == DIM){
fread(buff,sizeof(char),DIM,stdin);
poz = 0;
}
}
while(buff[poz] >= '0' && buff[poz] <= '9'){
n = n * 10 + buff[poz] - '0';
if(++poz == DIM){
fread(buff,sizeof(char),DIM,stdin);
poz = 0;
}
}
}
void ReadData(int &n, int &k, vector<int> &v){
freopen("sdo.in","r",stdin);
cit(n);cit(k);
for(int i = 0; i < n; ++i){
int x;
cit(x);
v.push_back(x);
}
}
int RandomPart(vector<int> &v, int left_pos, int right_pos){
int p = (rand() % (right_pos - left_pos)) + left_pos;
swap(v[p],v[right_pos]);
int i = left_pos, j = left_pos;
while(j < right_pos){
if(v[j] <= v[right_pos]){
swap(v[j],v[i]);
i++;
j++;
}else{
j++;
}
}
swap(v[right_pos],v[i]);
return i;
}
int Solve(vector<int> &v, int left_pos, int right_pos, int k_find){
if(left_pos == right_pos){
return v[left_pos];
}
int q = RandomPart(v, left_pos, right_pos);
int p = q - left_pos + 1;
if(p == k_find){
return v[q];
}
if(p > k_find){
return Solve(v, left_pos, q - 1, k_find);
}else{
return Solve(v, q + 1, right_pos, k_find - p);
}
}
int main(){
srand(time(NULL));
vector<int> v;
int n,k;
ReadData(n, k, v);
FILE *g = fopen("sdo.out","w");
fprintf(g,"%d\n", Solve(v, 0, n - 1, k));
fclose(g);
}