Cod sursa(job #1469640)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 8 august 2015 23:43:49
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 3000005
using namespace std;

int n, k, i, v[MAX];

int partition(int s, int d);
void sdo(int s, int d, int k);

int main(){
	srand(time(NULL));
	freopen("sdo.in", "r", stdin);
	freopen("sdo.out", "w", stdout);
	scanf("%d%d", &n, &k);
	for(i = 1; i <= n; i++)
		scanf("%d", &v[i]);
	sdo(1, n, k);
	printf("%d", v[k]);
	return 0;
}

int partition(int s, int d){
	int i = s, j = d;
	int pivot = v[s + rand() % (d - s + 1)];
	while(i < j){
		while(v[i] < pivot && i < d)
			i++;
		while(v[j] > pivot && j > s)
			j--;
		if(i <= j){
			swap(v[i], v[j]);
			i--;
			j--;
		}
	}
	return j;
}

void sdo(int s, int d, int k){
	if(s == d)
		return;

	int p = partition(s, d);
	int nr = p - s + 1;
	if(nr >= k)
		sdo(s, p, k);
	else
		sdo(p + 1, d, k - nr);
}