Cod sursa(job #2061585)

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

using namespace std;

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

const int MaxN = 3000005;

int v[MaxN];

int 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]);

  return lastSwapped;
}

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

  int finalPivPos = Partition(v, pivVal, lf, rg);

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


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

  return v[findElement];
}

int main() {
  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';

  // cout << 300000 << ' ' << 542 << '\n';
  // for (int i = 1; i <= 300000; ++i) {
  //   // cout << rand() % (int) 1e9 + 1 << ' ';
  //   cout << 300000 - i << ' ';
  // }
  return 0;
}