Cod sursa(job #2061573)

Utilizator BrandonChris Luntraru Brandon Data 9 noiembrie 2017 14:56:23
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <cstdlib>

using namespace std;

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

const int MaxN = 3000005;

int v[MaxN];

void Partition(int v[], int pivVal, int lf, int rg) {
  int lastSwapped = lf - 1;
  for (int i = lf; i < rg; ++i) {
    if (v[i] <= pivVal) {
      ++lastSwapped;
      swap(v[i], v[lastSwapped]);
    }
  }

  ++lastSwapped;
  swap(v[rg], v[lastSwapped]);
}

int NthElement(int v[], int findElement, int lf, int rg) {
  int pivPos = lf + rand() % (rg - lf + 1);
  int pivVal = v[pivPos];
  // cout << pivVal << endl;
  swap(v[pivPos], v[rg]);

  Partition(v, pivVal, lf, rg);

  // for (int i = 1; i <= n; ++i) {
  //   cout << v[i] << ' ';
  // }
  // cout << endl;


  if (findElement > pivPos) {
    return NthElement(v, findElement, pivPos + 1, rg);
  }
  else if (findElement < pivPos) {
    return NthElement(v, findElement, lf, pivPos - 1);
  }

  return v[findElement];
}

int main() {
  // int n, k;
  srand(time(0));
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; ++i) {
    cin >> v[i];
  }

  cout << NthElement(v, k, 1, n) << '\n';
  return 0;
}