Cod sursa(job #2217501)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 30 iunie 2018 17:09:57
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

void ReadData(int &n, int &k, vector<int> &v){
    FILE *f = fopen("sdo.in","r");
    fscanf(f,"%d%d",&n,&k);
    for(int i = 0; i < n; ++i){
        int x;
        fscanf(f,"%d",&x);
        v.push_back(x);
    }
    fclose(f);
}

int RandomPart(vector<int> &v, int left_pos, int right_pos){
    int msb = ((rand()) << 15);
    int p = (msb | (rand()));
    p = p % (right_pos - left_pos + 1) + left_pos;
    swap(v[p],v[right_pos]);
    int i = left_pos, j = left_pos;
    while(j < right_pos){
        if(v[j] <= v[right_pos]){
            swap(v[j],v[i]);
            i++;
            j++;
        }else{
            j++;
        }
    }
    swap(v[right_pos],v[i]);
    return i;
}

int Solve(vector<int> &v, int left_pos, int right_pos, int k_find){
    if(left_pos == right_pos){
        return v[left_pos];
    }
    int q = RandomPart(v, left_pos, right_pos);
    int p = q - left_pos + 1;
    if(p == k_find){
        return v[q];
    }
    if(p > k_find){
        return Solve(v, left_pos, q - 1, k_find);
    }else{
        return Solve(v, q + 1, right_pos, k_find - p);
    }
}

int main(){
    srand(time(NULL));
    vector<int> v;
    int n,k;
    ReadData(n, k, v);
    FILE *g = fopen("sdo.out","w");
    fprintf(g,"%d\n", Solve(v, 0, n - 1, k));
    fclose(g);
}