Cod sursa(job #735451)

Utilizator a08iAndrei Ionescu a08i Data 16 aprilie 2012 15:09:11
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<vector>
#include<iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

int generate_random(int max)
{
  return rand() % (max+1);
}

void quicksort(vector<int> &a, int first, int last, int &K, int &ret)
{

  if(first == last)
  {
    ret = a[last];
  }

  if(first >= last)
  {
    return;
  }

  int p = first + generate_random(last-first);
  swap(a[first], a[p]);

  // partition a around p
  int i=first, j=first+1;
  while(j<=last)
  {
    if(a[j] < a[first])
    {
      swap(a[j],a[++i]);
    }
    j++;
  }
  swap(a[first], a[i]);


  if(i == K)
  {
    ret =  a[i];
    return;
  }

  if(K < i)
  {
    // sort left
    quicksort(a, first, i-1, K, ret);
  }
  else
  {
    // sort right
    quicksort(a, i+1, last, K, ret);
  }
}

int main()
{

  freopen("sdo.in", "r", stdin);
  freopen("sdo.out", "w", stdout);

  int N, K, temp;

  scanf("%d %d", &N, &K);

  vector<int> ints;
  ints.reserve(N);

  for(int i=0; i<N; i++)
  {
    scanf("%d", &temp);
    ints.push_back(temp);
  }

  K = K-1; //0-indexed

  srand(time(0));
  int ret = 0;
  quicksort(ints, 0, ints.size()-1, K, ret);

  printf("%d", ret);

  return 0;
}