Cod sursa(job #824670)

Utilizator lucky1992Ion Ion lucky1992 Data 26 noiembrie 2012 20:42:57
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <ctime>
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;


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

int partition( int* A, int left, int right ){
  srand( (unsigned)time(NULL));
  int r = left +  rand()%( right - left );
  swap( A[r], A[right] );
  int x = A[right];
  int i = left - 1;
  for( int j = left; j <= right - 1; j++ ){
	if( A[j] < x ){
	  i++;
	  swap(A[i],A[j]);
	}
  }
  swap(A[i+1],A[right]);
  return i+1;
}

int GetKth( int* A, int left, int right, int k ){
    if( left == right ) return A[left];
    int q = partition( A, left, right );
    int i = q - left + 1;
    if( i == k )
      return A[q];
    else if ( k < i ) return GetKth( A, left, q-1, k );
    else return GetKth( A, q+1, right, k - i );
}

int main( int argc, char* argv[] ){
    ifstream in("sdo.in");
    ofstream out("sdo.out");

    
    int N = 0, k = 0;
    in >> N >> k;
    int* v = new int[N+1];
    for( int i = 1; i <= N; i++ )
      in >> v[i];
    in.close();
    
    
    int kth = GetKth( v, 1, N, k );
    out << kth << endl;
    out.close();
    delete []v;
    return 0;
}