Pagini recente » Diferente pentru info-oltenia-2018/individual intre reviziile 16 si 14 | Istoria paginii runda/vocea_romaniei/clasament | Istoria paginii runda/nimic_suspect./clasament | Diferente pentru info-oltenia-2018/individual intre reviziile 13 si 14 | Cod sursa (job #1581941)
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
#define nmax 3000001
ifstream fi("sdo.in");
ofstream fo("sdo.out");
int n, k;
int A[nmax];
int qs(int st, int dr)
{
int i = st;
int j = dr;
int pivot = A[i + rand() % (j - i + 1)];
while (1)
{
for (; A[i] < pivot;) i++;
for (; A[j] > pivot;) j--;
if (i <= j)
swap(A[i++], A[j--]);
else
return j;
}
return 0;
}
void solve(int st, int dr, int k)
{
if (st == dr)
return;
int positionInCurrentInterval = qs(st, dr);
int lengthOfCurrentInterval = positionInCurrentInterval - st + 1;
if (lengthOfCurrentInterval >= k)
solve(st, positionInCurrentInterval, k);
else
solve(positionInCurrentInterval + 1, dr, k - lengthOfCurrentInterval);
}
int main()
{
srand(time(0));
fi >> n >> k;
for (int i = 1; i <= n; i++)
fi >> A[i];
solve(1, n, k);
fo << A[k] << "\n";
fi.close();
fo.close();
return 0;
}