Cod sursa(job #2948081)

Utilizator Teodor94Teodor Plop Teodor94 Data 27 noiembrie 2022 11:12:40
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define MAX_N 3000000

int v[MAX_N];

inline bool isDigit(char c) {
  return c >= '0' && c <= '9';
}

// citire numar natural
int readInt(FILE* fin) {
  char ch;
  int res = 0;

  // eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
  while (!isDigit(ch = fgetc(fin)));

  // adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
  do {
    res = 10 * res + ch - '0';
  } while (isDigit(ch = fgetc(fin)));

  return res;
}

void swap(int& a, int& b) {
  int aux = a;
  a = b;
  b = aux;
}

void qsort(int v[], int k, int begin, int end) {
  int pivot = v[begin + rand() % (end - begin + 1)]; // alegem pivotul aleator

  int b = begin, e = end;
  while (v[b] < pivot) // cauta primul element mai mare sau egal cu pivotul
    b++;

  while (v[e] > pivot) // cauta primul element mai mic sau egal cu pivotul
    e--;

  while(b < e) {      // daca indicii nu s-au atins
    swap(v[b], v[e]); // interschimba pozitiile

    do                // cauta primul element mai mare sau egal cu pivotul
      b++;
    while (v[b] < pivot);

    do                // cauta primul element mai mic sau egal cu pivotul
      e--;
    while (v[e] > pivot);
  }

  // acum [begin..e] sunt mai mici sau egale cu pivotul
  // si [e+1..end] sunt mai mari sau egale cu pivotul
  if (begin < e && k <= e)
    qsort(v, k, begin, e);   // al k-lea element se afla in stanga
  else if (e + 1 < end)
    qsort(v, k, e + 1, end); // al k-lea element se afla in dreapta
}

int main() {
  FILE* fin = fopen("sdo.in", "r");
  FILE* fout = fopen("sdo.out", "w");

  int n, k, i;
  fscanf(fin, "%d%d", &n, &k);
  for (i = 0; i < n; ++i)
    v[i] = readInt(fin);

  qsort(v, k - 1, 0, n - 1);

  fprintf(fout, "%d\n", v[k - 1]);

  fclose(fin);
  fclose(fout);
  return 0;
}