Cod sursa(job #2284025)

Utilizator stefaannaStefana Mitrea stefaanna Data 16 noiembrie 2018 16:40:08
Problema Statistici de ordine Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int sdo(int left, int right, int k, vector <int> &v) {
    if (left==right)
        return v[left];

    vector <int> st,dr;
    int mid = (left + right) / 2;
    int val=v[mid];
    for (int i=left;i<=right;i++) {
        if (v[i]<val)
            st.push_back(v[i]);
        else
            if (v[i]>val) dr.push_back(v[i]);
    }
    int num_left = st.size(); // e de preferat sa nu folosesti de fiecare data st.size()
    int num_right = dr.size();
    for (int i = 0; i < num_left; i++)
        v[left + i] = st[i];
    for (int i = 0; i < num_right; i++)
        v[right - i] = dr[i];
    if(num_left < k && k <= right - left + 1 - num_right)
        return val; // tratez cazul in care raspunsul este chiuar val si separat atunci cand este mai mic, respectiv mai mare


    if (k <= num_left)
        return sdo(left, left + num_left - 1, k, v);
    return sdo(right - num_right + 1 , right, k - (right - left + 1 - num_right), v); // prima pozitie de dupa alea din stanga este posibil sa fie egala cu val si nu vrem asta
    // din k scazi cate numere sunt "<=" (adica inclusiv alea egale cu val). Acestea sunt numarul total de elemente: right - left + 1 minus cele mai mari: num_right
}

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