Cod sursa(job #796901)

Utilizator razvan.popaPopa Razvan razvan.popa Data 12 octombrie 2012 21:45:55
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <string>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#include <time.h>
#include <algorithm>

#define infile "sdo.in"
#define outfile "sdo.out"

#define n_max 3000000
#define INF 1 << 30
#define MOD 666013

#define ll long long
#define ull unsigned long long

#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define FOR(g) \
    for(vector<int>::iterator it=g.begin(); it!=g.end(); ++it)
#define nxt (*it)

#define min(x,y) x<y ? x : y
#define max(x,y) x>y ? x : y
using namespace std;

int N, K;

int a[n_max];


void read(){
    ifstream fin(infile);

    fin >> N >> K;

    for(int i=0; i<N; ++i)
        fin >> a[i];

    srand(time(NULL));

    fin.close();
}

int partition(int lo, int hi){
    swap(a[lo], a[rand()%(hi - lo + 1) + lo]);

    int v = a[lo];
    int i = lo;
    int j = hi + 1;

    while(true){
        while(i < hi && a[++i] < v);
        while(j > lo && a[--j] > v);

        if(i >= j)
           break;

        swap(a[i], a[j]);
    }
    swap(a[lo], a[j]);

    return j;
}


int solve(int lo, int hi, int pos){
    int pivotPosition = partition(lo, hi);

    int nrSmaller = pivotPosition - lo;

    if(nrSmaller + 1 < pos)
       return solve(pivotPosition + 1, hi, pos - (nrSmaller + 1));
    else if(nrSmaller + 1 > pos)
       return solve(lo, pivotPosition - 1, pos);

    return a[pivotPosition];
}



void print(){
    ofstream fout(outfile);

    fout << solve(0, N-1, K);

    fout.close();
}


int main(){

    read();
    print();

    return 0;
}