Cod sursa(job #1428302)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 4 mai 2015 01:06:08
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>

#define MAX_N 3000000
#define MIN(a, b) ((a) < (b) ? (a) : (b))

int v[MAX_N];

int quickSelect(int left, int right, int k) {
  if (left == right) {
    return v[left];
  }
  int i = left - 1;
  int j = right + 1;
  int piv = (v[left] / 3 + v[right] / 3 + v[(left + right) >> 1] / 3);
  
  do {
    do {
      i++;
    } while (v[i] < piv);
    do {
      j--;
    } while (v[j] > piv);
    if (i < j) {
      int tmp = v[i];
      v[i] = v[j];
      v[j] = tmp;
    }
  } while (i < j);
  
  if (k <= j - left + 1) {
    return quickSelect(left, j, k);
  } else {
    return quickSelect(j + 1, right, k - (j - left + 1));
  }
}
int main(void) {
  FILE *f = fopen("sdo.in", "r");
  int n, k;
  
  fscanf(f, "%d%d", &n, &k);
  for (int i = 0; i < n; i++) {
    fscanf(f, "%d", &v[i]);
  }
  fclose(f);
  f = fopen("sdo.out", "w");
  fprintf(f, "%d\n", quickSelect(0, n - 1, k));
  fclose(f);
  return 0;
}