Cod sursa(job #1049071)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 6 decembrie 2013 20:56:51
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

int pivot(vector<int>& v, int from, int to) {
    int  pivotPos = from + (rand() % (to-from+1));
    int aux = v[from];
    v[from] = v[pivotPos];
    v[pivotPos] = aux;
    
    pivotPos = from;
    
    for(int i=from+1; i<=to;i++) {
        if(v[i] < v[pivotPos]) {
            exchg(v[pivotPos], v[pivotPos+1]);
            if(i!=pivotPos+1)
                exchg(v[pivotPos], v[i]);
            pivotPos++;
        }
    }
    
    return pivotPos;
}

void mysort(vector<int>& v, int from, int to) {
    if(from>=to) return;
    int k = pivot(v, from, to);
    mysort(v, from, k-1);
    mysort(v, k+1, to);
    
}


void kthElement(vector<int>& v,int from, int to, int k) {
    if(from>to)
        return;
    int m = pivot(v, from, to);
    int dist = m-from;
    if(dist > k) {
        kthElement(v, from, m-1, k);
    }
    if (dist < k) {
        kthElement(v, m+1, to, k-dist-1);
    }
}

int main() {
    int n,k, x;
    ifstream in("sdo.in");
    ofstream out("sdo.out");
    in>>n>>k;
    
    vector<int> v(n);
    for(int i=0;i<n;i++) {
        in>>x;v[i] = x;
    }
    
    kthElement(v,0,v.size()-1,k-1);
    out<<v[k-1];
    return 0;
}