Cod sursa(job #1439247)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 21 mai 2015 21:22:20
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdlib>
#include <fstream>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
  
int N, K, *v;

int _partition(int *v, int st, int dr, int value) {
  int i = st, j = dr;
  while (i < j) {
    while (i < j && v[i] < value) i++;
    while (i < j && v[j] > value) j--;
    if (i < j) {
      std::swap(v[i], v[j]);
    } else {
      return j; 
    }
  }
  return 0;
}

void nth_element(int *v, int st, int dr, int k) {

  if (k == 1) {
    int minim = v[st], poz = 1;
    for (int i = st; i <= dr; i++) {
      if (v[i] < minim) {
        minim = v[i];
        poz = i;
      }
    }
    std::swap(v[1], v[poz]);
    return ;
  }

  int N = (dr - st + 1), pivot = v[ st + rand() % N];

  int p = _partition(v, st, dr, pivot);

  if (p - st + 1 >= k) {
    nth_element(v, st, p, k);
  } else {
    nth_element(v, p+1, dr, k - (p-st+1));
  }
}

int main() {

  f >> N >> K;
  v = new int[N];
  for (int i = 1; i <= N; i++) {
    f >> v[i];
  }

  nth_element(v, 1, N, K);

  g << v[K] << '\n';

  f.close();
  g.close();
  delete v;
  return 0;
}