Cod sursa(job #2290986)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 27 noiembrie 2018 11:45:20
Problema Statistici de ordine Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include <algorithm>
#include <ctime>
#include <cstdlib>

using namespace std;

typedef long T;

const T NMAX = 3000005;

T N;
T K;
T vec[NMAX];

T partition(T l, T r) {
   T ix = l + rand() % ((r + 1) - l);
   swap(vec[ix], vec[r]);

   T pval = vec[r];
   int i = l - 1;

   for (int j = l; j < r; ++j) {
      if (vec[j] <= pval) {
         i++;
         swap(vec[i], vec[j]);
      }
   }

   swap(vec[r], vec[i+1]);

   return i+1;
}

T quicksort(T l, T r) {
   if (l >= r) {
      return vec[l];
   }
   T p = partition(l, r);
   if (p == K) {
      return vec[p];
   }
   if (p < K) {
      quicksort(p + 1, r);
   } else {
      quicksort(l, p - 1);
   }
}

int main() {
   srand(time(0));

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

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

   for (T i = 1; i <= N; ++i) {
      scanf("%ld", &vec[i]);
   }

   T elm = quicksort(1, N);

   printf("%ld ", elm);

   fclose(stdin);
   fclose(stdout);
   return 0;
}