Cod sursa(job #2424621)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 23 mai 2019 15:31:00
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <random>
#include <chrono>
#include <cctype>

using namespace std;

#define buff_size 104576
char buff[buff_size];
int pos = 0;

inline void read(int &nr)
{
  while(!isdigit(buff[pos]))
    if(++pos == buff_size)
      fread(buff,  1, buff_size, stdin), pos = 0;
  nr = 0;
  while(isdigit(buff[pos]))
  {
    nr = (nr << 1) + (nr << 3) + buff[pos] - 48;
    if(++pos == buff_size)
      fread(buff, 1, buff_size, stdin), pos = 0;
  }
}

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 3000000 + 7;
int n, k, a[N];

int kthelement(int l, int r, int k)
{
  if(l == r)
  {
    return a[l];
  }
  int pivot = a[rng() % (r - l + 1) + l];
  int i = l;
  for(int j = l; j <= r; j++)
  {
    if(a[j] <= pivot)
    {
      swap(a[j], a[i]);
      i++;
    }
  }
  i--;
  if(k <= i - l + 1)
  {
    return kthelement(l, i, k);
  }
  else
  {
    return kthelement(i + 1, r, k - (i - l + 1));
  }
}

int main()
{
  freopen("sdo.in", "r", stdin);
  freopen("sdo.out", "w", stdout);
  read(n);
  read(k);
  for(int i = 1; i <= n; i++)
  {
    read(a[i]);
  }
  printf("%d\n", kthelement(1, n, k));
  return 0;
}