Cod sursa(job #909552)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 10 martie 2013 16:05:36
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

class sdo {
public:
  int get_pivot(int *V, int left, int right) {
    if (left + 4 > right)
      return (left + right) / 2;
    int diff = right - left + 1;
    vector<int> vec;
    for (int i = 0; i < 5; i++)
      vec.push_back(rand() % diff + left);
    for (int i = 0; i < 5; i++) {
      int cnt_left = 0, cnt_right = 0;
      for (int j = 0; j < 5; j++)
	if (j != i) {
	  if (V[vec[j]] <= V[vec[i]])
	    cnt_left++;
	  if (V[vec[j]] >= V[vec[i]])
	    cnt_right++;
	}
      if (cnt_left >= 2 && cnt_right >= 2)
	return vec[i];
    }
    return left;
  }
  
  int get_kth(int* V, int left, int right, int k) {
    if (left == right)
      return left;
    int p = get_pivot(V, left, right);
    int p_val = V[p];
    int poz = left;
    int aux = V[p];
    V[p] = V[right];
    V[right] = aux;
    for (int i = left; i < right; i++)
      if (V[i] <= p_val) {
	aux = V[poz];
	V[poz] = V[i];
	V[i] = aux;
	poz++;
      }
    aux = V[poz];
    V[poz] = V[right];
    V[right] = aux;
    if ((poz - left + 1) == k)
      return poz;
    if ((poz - left) >= k)
      return get_kth(V, left, poz - 1, k);
    return get_kth(V, poz + 1, right, k);
  }
  
  int get_kth(int N, int* V, int k) {
    return get_kth(V, 0, N - 1, k);
  }
};
int main()
{
  freopen("sdo.in", "r", stdin);
  freopen("sdo.out", "w", stdout);
  
  srand(time(0));
  int N, K;
  scanf("%d %d", &N, &K);
  int* V = new int[N];
  for (int i = 0; i < N; i++)
    scanf("%d", &V[i]);
  sdo S;
  printf("%d\n", V[S.get_kth(N, V, K)]);
  delete[] V;
  return 0;
}