Pagini recente » Cod sursa (job #384078) | Cod sursa (job #953313) | Cod sursa (job #2184806) | Istoria paginii runda/simulare_oji_2021_cl10 | Cod sursa (job #2284025)
#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;
}