Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
- void swap(int &a, int &b) {
- if (a == b) return;
- a = a ^ b;
- b = a ^ b;
- a = a ^ b;
- }
- int lomutoPartition(int *a, int l, int r) {
- int mid = l + (r - l) / 2;
- if (a[mid] > a[r]) {
- swap(a[mid], a[r]);
- }
- if (a[l] > a[r] ) {
- swap(a[r],a[l]);
- }
- if (a[mid] < a[l]) {
- swap(a[mid],a[l]);
- }
- int pivot = a[l];
- int i = r;
- for (int j = r; j > l; j--) {
- if (a[j] >= pivot) {
- swap(a[i],a[j]);
- i--;
- }
- }
- swap(a[i],a[l]);
- return i;
- }
- int lomutoPartition2(int *a, int l, int r) {
- int mid = l + (r - l) / 2;
- if (a[mid] > a[l]) {
- swap(a[mid], a[l]);
- }
- if (a[l] < a[r] ) {
- swap(a[r],a[l]);
- }
- if (a[mid] < a[r]) {
- swap(a[mid],a[r]);
- }
- int pivot = a[r];
- int i = l;
- for (int j = l; j < r; j++) {
- if (a[j] <= pivot) {
- swap(a[i],a[j]);
- i++;
- }
- }
- swap(a[i],a[r]);
- return i;
- }
- int kStat(int *a, int l, int r,int k){
- while(true) {
- int p = lomutoPartition(a, l, r);
- if (k == p)
- return a[k];
- else if (k > p) {
- l = p + 1;
- } else {
- r = p - 1;
- }
- }
- }
- void qsort(int *a, int l, int r) {
- if (l < r) {
- int p =lomutoPartition(a,l,r);
- qsort(a, l, p-1);
- qsort(a, p+1, r);
- }
- }
- int main() {
- std::ios_base::sync_with_stdio(0);
- cin.tie(0);
- int n, k;
- cin >> n >> k;
- int *a = new int[n];
- bool f = true;
- cin>>a[0];
- for (int i = 1; i < n; i++) {
- if (a[i-1] > a[i])
- f = false;
- cin >> a[i];
- }
- if (!f)
- cout<<kStat(a,0,n-1,k);
- else cout<<a[k];
- // qsort(a, 0, n - 1);
- // for (int i = 0; i < k; i++)
- // cout<<a[i]<<" ";
- delete []a;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement