Cod sursa(job #2650583)

Utilizator madalin_frFrincu Madalin madalin_fr Data 19 septembrie 2020 13:57:45
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>

using namespace std;
#define NMAX 3000010
ifstream f("sdo.in");
ofstream g("sdo.out");
int v[NMAX], n, k;

int partitie(int v[], int li, int lf) // Lomuto Partitioning
{
  int pivot = lf, i = li;
  for (int j = li; j < lf; j++)
    if (v[j] < v[pivot]) {
      swap(v[j], v[i]);
      i++;
    }
  swap(v[pivot], v[i]);
  return i;
}

int random_pivot(int v[], int li, int lf) {
  int n = rand();
  int pivot = li + n % (lf - li + 1);
  swap(v[pivot], v[lf]);
  return partitie(v, li, lf);
}

int qckselect(int v[], int li, int lf, int k) {
  if (li == lf)
    return v[li];
  int pivot = random_pivot(v, li, lf);
  int poz = pivot - li + 1;
  if (k <= poz)
    return qckselect(v, li, pivot, k);
  else
    return qckselect(v, pivot + 1, lf, k - poz);
}

int main() {
  f >> n >> k;
  for (int i = 1; i <= n; i++)
    f >> v[i];
  g << qckselect(v, 1, n, k);
  return 0;
}