Cod sursa(job #2217503)

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

using namespace std;

#define DIM 10000
int poz = 0;
char buff[DIM];

void cit(int &n){
    n = 0;
    while(buff[poz] < '0' || buff[poz] > '9'){
        if(++poz == DIM){
            fread(buff,sizeof(char),DIM,stdin);
            poz = 0;
        }
    }
    while(buff[poz] >= '0' && buff[poz] <= '9'){
        n = n * 10 + buff[poz] - '0';
        if(++poz == DIM){
            fread(buff,sizeof(char),DIM,stdin);
            poz = 0;
        }
    }
}

void ReadData(int &n, int &k, vector<int> &v){
    freopen("sdo.in","r",stdin);
    cit(n);cit(k);
    for(int i = 0; i < n; ++i){
        int x;
        cit(x);
        v.push_back(x);
    }
}

int RandomPart(vector<int> &v, int left_pos, int right_pos){
    int p = (rand() % (right_pos - left_pos)) + 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);
}