Cod sursa(job #536275)

Utilizator andreitheo87Teodorescu Andrei-Marius andreitheo87 Data 18 februarie 2011 14:48:14
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdlib.h>
#include <fstream>
#include <iostream>

using namespace std;
#define MAXN 3000000
int vec[MAXN];

int aux_swap;
inline void swap(int* v, int p1, int p2) {
  aux_swap = v[p1]; v[p1] = v[p2]; v[p2] = aux_swap;
}

int get_k_th(int* vec, int left, int right, int k) {
  if (left==right) {
    return vec[left];
  }
  int len = right - left + 1;
  int index_piv = left + rand() % len;
  int piv_value = vec[index_piv];
  int index_left = left;
  int index_right = right;
  swap(vec, index_right, index_piv);
  index_piv = left;
  for (int i=left; i<right; i++) {
    if (vec[i] < piv_value) {
      swap(vec, index_piv, i);
      index_piv++;
    }
  }
  swap(vec, index_piv, right);
  if (index_piv-left+1 >= k) {
    return get_k_th(vec, left, index_piv, k);
  } else {
    return get_k_th(vec, index_piv+1, right, k-(index_piv-left+1));
  }
}

int main() {
  fstream in("sdo.in", fstream::in);
  fstream out("sdo.out", fstream::out);
  int n, k;
  in >> n >> k;
  for (int i=0; i<n; i++) {
    in >> vec[i];
  }
  out << get_k_th(vec, 0, n-1, k) << endl;
  out.close();
  return 0;
}