Cod sursa(job #2669957)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 8 noiembrie 2020 15:33:11
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <algorithm>
#include <ctype.h>

using namespace std;

int v[3000000];

FILE *fin, *fout;

int readInt(){
  char ch;
  int n;
  while(!isdigit(ch = fgetc(fin)));
  n = ch - '0';
  while(isdigit(ch = fgetc(fin))){
    n = n *10 + ch - '0';
  }
  return n;
}

void quickselect(int pmin, int pmax, int poz){
  int b, e, p;
  p = v[(pmin + pmax) / 2];
  b = pmin;
  e = pmax;
  while(v[b] < p){
    b++;
  }
  while(v[e] > p){
    e--;
  }
  while(b < e){
    swap(v[b], v[e]);
    do{
      b++;
    }while(v[b] < p);
    do{
      e--;
    }while(v[e] > p);
  }
  if((poz <= e) && (pmin < e)){
    quickselect(pmin, e, poz);
  }else if((e + 1) < pmax){
    quickselect(e + 1, pmax, poz);
  }
}

int main()
{
    int n, k, i;
    fin = fopen("sdo.in", "r");
    n = readInt();
    k = readInt();
    for(i = 0; i < n; i++){
      v[i] = readInt();
    }
    fclose(fin);
    quickselect(0, n - 1, k - 1);
    fout = fopen("sdo.out", "w");
    fprintf(fout, "%d", v[k - 1]);
    fclose(fout);
    return 0;
}