Pagini recente » Cod sursa (job #2395654) | Cod sursa (job #3123252) | Autentificare | Cod sursa (job #2480224) | Cod sursa (job #2217501)
#include <bits/stdc++.h>
using namespace std;
void ReadData(int &n, int &k, vector<int> &v){
FILE *f = fopen("sdo.in","r");
fscanf(f,"%d%d",&n,&k);
for(int i = 0; i < n; ++i){
int x;
fscanf(f,"%d",&x);
v.push_back(x);
}
fclose(f);
}
int RandomPart(vector<int> &v, int left_pos, int right_pos){
int msb = ((rand()) << 15);
int p = (msb | (rand()));
p = p % (right_pos - left_pos + 1) + 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);
}