Cod sursa(job #2518192)

Utilizator euyoTukanul euyo Data 5 ianuarie 2020 12:01:22
Problema Statistici de ordine Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int v[3000000];

int main() {
  FILE *fin = fopen( "sdo.in", "r" );
  FILE *fout = fopen( "sdo.out", "w" );
  int n, k, i, st, dr, pivotVal, b, e, aux;

  fscanf( fin, "%d%d", &n, &k );
  --k;
  for ( i = 0; i < n; ++i ) {
    fscanf( fin, "%d", &v[i] );
  }
  st = 0;
  dr = n - 1;
  srand( time( NULL ) );
  while ( dr > st ) {
    pivotVal = v[(rand() % ( dr - st + 1 )) + st];
    b = st;
    e = dr;
    while ( v[b] < pivotVal ) {
      ++b;
    }
    while ( v[e] > pivotVal ) {
      --e;
    }
    while ( b < e ) {
      if ( b < e ) {
        aux = v[b];
        v[b] = v[e];
        v[e] = aux;
        ++b;
        --e;
      }
      while ( v[b] < pivotVal ) {
        ++b;
      }
      while ( v[e] > pivotVal ) {
        --e;
      }
    }
    if ( k <= e ) {
      dr = e;
    } else {
      st = e + 1;
    }
  }
  fprintf( fout, "%d", v[k] );
  fclose( fin );
  fclose( fout );
  return 0;
}