Pagini recente » Borderou de evaluare (job #821413) | Borderou de evaluare (job #424814) | Cod sursa (job #2985206) | Cod sursa (job #318194) | Cod sursa (job #2913511)
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;
int partition(vector<int> &v, int a, int b)
{
srand(time(NULL));
int q = rand() % (b - a + 1) + a;
int i = a - 1;
int j = a;
int x = v[q];
swap(v[q], v[b]);
while (j < b) {
if (v[j] <= x)
swap(v[++i], v[j]);
j++;
}
swap(v[i + 1], v[b]);
return i + 1;
}
int select(vector<int> &v, int a, int b, int i)
{
if (a == b)
return v[a];
int q = partition(v, a, b);
int k = q - a + 1;
if (k == i)
return v[q];
else if (i < k)
return select(v, a, q - 1, i);
return select(v, q + 1, b, i - k);
}
int select(vector<int> &v, int i)
{
return select(v, 0, (int) v.size() - 1, i);
}
int main(void)
{
ifstream in("sdo.in");
ofstream out("sdo.out");
int i, n, k;
in >> n >> k;
vector<int> v(n);
for (i = 0; i < n; i++)
in >> v[i];
out << select(v, k);
in.close();
out.close();
return 0;
}