Cod sursa(job #2180418)

Utilizator rrobertBulgaru Robert rrobert Data 20 martie 2018 20:57:01
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <fstream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

ifstream in("sdo.in");
ofstream out("sdo.out");

#define MAX 3000005

int v[MAX];
int n,k;

int partition(int p,int r) {
	int temp,rnd=p+rand()%(r-p+1);
	int i=p-1,x=v[r];

	temp=v[r];
	v[r]=v[rnd];
	v[rnd]=temp;

	for (int j=p;j<r;j++) {
		if (v[j]<=x) {
			i++;

			temp=v[j];
			v[j]=v[i];
			v[i]=temp;
		}
	}

	temp=v[r];
	v[r]=v[i+1];
	v[i+1]=temp;

	return i+1;
}

int k_th_el(int p,int r,int k) {
	int pos=partition(p,r);

	if (pos-p==k-1)
		return v[pos];
	else if (pos-p>k-1)
		return k_th_el(p,pos-1,k);
	else
		return k_th_el(pos+1,r,k-pos+p-1);
}	

int main() {
	in>>n>>k;

	for (int i=0;i<n;i++)
		in>>v[i];

	out<<k_th_el(0,n-1,k-1);

	in.close();
	out.close();
	return 0;
}