Pagini recente » Cod sursa (job #778457) | Cod sursa (job #1800249) | Cod sursa (job #2737806) | Borderou de evaluare (job #2016670) | Cod sursa (job #796901)
Cod sursa(job #796901)
#include <fstream>
#include <string>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#define infile "sdo.in"
#define outfile "sdo.out"
#define n_max 3000000
#define INF 1 << 30
#define MOD 666013
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define FOR(g) \
for(vector<int>::iterator it=g.begin(); it!=g.end(); ++it)
#define nxt (*it)
#define min(x,y) x<y ? x : y
#define max(x,y) x>y ? x : y
using namespace std;
int N, K;
int a[n_max];
void read(){
ifstream fin(infile);
fin >> N >> K;
for(int i=0; i<N; ++i)
fin >> a[i];
srand(time(NULL));
fin.close();
}
int partition(int lo, int hi){
swap(a[lo], a[rand()%(hi - lo + 1) + lo]);
int v = a[lo];
int i = lo;
int j = hi + 1;
while(true){
while(i < hi && a[++i] < v);
while(j > lo && a[--j] > v);
if(i >= j)
break;
swap(a[i], a[j]);
}
swap(a[lo], a[j]);
return j;
}
int solve(int lo, int hi, int pos){
int pivotPosition = partition(lo, hi);
int nrSmaller = pivotPosition - lo;
if(nrSmaller + 1 < pos)
return solve(pivotPosition + 1, hi, pos - (nrSmaller + 1));
else if(nrSmaller + 1 > pos)
return solve(lo, pivotPosition - 1, pos);
return a[pivotPosition];
}
void print(){
ofstream fout(outfile);
fout << solve(0, N-1, K);
fout.close();
}
int main(){
read();
print();
return 0;
}