#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
int partition(int arr[], int p, int q) {
swap(arr + (rand() % (q - p + 1)) + p, arr + q);
int i = p;
for (int j = p; j < q; j++) {
if (arr[j] < arr[q]) {
swap(arr + i++, arr + j);
}
}
swap(arr + q, arr + i);
return i;
}
int select(int arr[], int p, int q, int n) {
int r;
if (p >= q) {
r = arr[p];
} else {
int m = partition(arr, p, q), k = m - p + 1;
if (n == k) {
r = arr[m];
} else if (n < k) {
r = select(arr, p, m - 1, n);
} else {
r = select(arr, m + 1, q, n - k);
}
}
return r;
}
int main() {
int arr[] = {5, 1, 20, 4, 99}, size = sizeof(arr) / sizeof(int);
printf("%d", select(arr, 0, size - 1, 3));
return 0;
}