Cod sursa(job #1861866)

Utilizator cella.florescuCella Florescu cella.florescu Data 29 ianuarie 2017 12:47:01
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 3e6;

int v[MAXN];

int part(int l, int r) {
  int piv = v[l + rand() % (r - l + 1)], aux;
  --l; ++r;
  while (l < r) {
    do {
      ++l;
    } while (piv > v[l]);
    do {
      --r;
    } while (piv < v[r]);
    if (l < r) {
      aux = v[l]; v[l] = v[r]; v[r] = aux;
    }
  }
  return r;
}

void compute(int l, int r, int k) {
  if (l < r) {
    int p = part(l, r);
    if (k <= p - l)
      compute(l, p, k);
    else
      compute(p + 1, r, k - p + l - 1);
  }
}

int main()
{
    int n, k;
    ifstream fin("sdo.in");
    fin >> n >> k;
    for (int i = 0; i < n; ++i)
      fin >> v[i];
    fin.close();
    compute(0, n - 1, k - 1);
    ofstream fout("sdo.out");
    fout << v[k - 1] << '\n';
    fout.close();
    return 0;
}