#include <iostream>
using namespace std;
void prepare_killer(int* a, int length)
{
int origidx[length];
for (int i = 0; i < length; i++)
origidx[i] = i;
// эмулируем прохождение qsort по плохому пути
// r будет всё время константой
int r = length - 1;
// а l будет каждый раз увеличиваться на 1
for (int l = 0; l < r; l++)
{
// так будет выбран pivot:
int p = (l + r) / 2;
// элементы с индексами l и p поменяются местами
swap(origidx[l], origidx[p]);
}
// имея позиции, куда придут данные, можно теперь их расставить:
for (int i = 0; i < length; i++)
a[origidx[i]] = i + 1;
}
bool qsort_check_failed = false;
void qsort_with_check(int *a, int l, int r)
{
if (l >= r)
return;
int x = a[(l + r) / 2];
int i = l, j = r;
while (i <= j)
{
while (a[i] < x) ++i;
while (a[j] > x) --j;
if (i <= j)
{
swap(a[i], a[j]);
++i, --j;
}
}
if (!(l >= j))
{
cout << "Mistake: have non-empty first subtask!" << endl;
qsort_check_failed = true;
}
qsort_with_check(a, l, j);
qsort_with_check(a, i, r);
}
int main()
{
const int length = 28;
int a[length];
prepare_killer(a, length);
qsort_with_check(a, 0, length - 1);
if (!qsort_check_failed)
cout << "killer sequence succeeded" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBwcmVwYXJlX2tpbGxlcihpbnQqIGEsIGludCBsZW5ndGgpCnsKICAgIGludCBvcmlnaWR4W2xlbmd0aF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogICAgICAgIG9yaWdpZHhbaV0gPSBpOwoKICAgIC8vINGN0LzRg9C70LjRgNGD0LXQvCDQv9GA0L7RhdC+0LbQtNC10L3QuNC1IHFzb3J0INC/0L4g0L/Qu9C+0YXQvtC80YMg0L/Rg9GC0LgKICAgIC8vIHIg0LHRg9C00LXRgiDQstGB0ZEg0LLRgNC10LzRjyDQutC+0L3RgdGC0LDQvdGC0L7QuQogICAgaW50IHIgPSBsZW5ndGggLSAxOwoKICAgIC8vINCwIGwg0LHRg9C00LXRgiDQutCw0LbQtNGL0Lkg0YDQsNC3INGD0LLQtdC70LjRh9C40LLQsNGC0YzRgdGPINC90LAgMQogICAgZm9yIChpbnQgbCA9IDA7IGwgPCByOyBsKyspCiAgICB7CiAgICAgICAgLy8g0YLQsNC6INCx0YPQtNC10YIg0LLRi9Cx0YDQsNC9IHBpdm90OgogICAgICAgIGludCBwID0gKGwgKyByKSAvIDI7CgogICAgICAgIC8vINGN0LvQtdC80LXQvdGC0Ysg0YEg0LjQvdC00LXQutGB0LDQvNC4IGwg0LggcCDQv9C+0LzQtdC90Y/RjtGC0YHRjyDQvNC10YHRgtCw0LzQuAogICAgICAgIHN3YXAob3JpZ2lkeFtsXSwgb3JpZ2lkeFtwXSk7CiAgICB9CgogICAgLy8g0LjQvNC10Y8g0L/QvtC30LjRhtC40LgsINC60YPQtNCwINC/0YDQuNC00YPRgiDQtNCw0L3QvdGL0LUsINC80L7QttC90L4g0YLQtdC/0LXRgNGMINC40YUg0YDQsNGB0YHRgtCw0LLQuNGC0Yw6CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogICAgICAgIGFbb3JpZ2lkeFtpXV0gPSBpICsgMTsKfQoKYm9vbCBxc29ydF9jaGVja19mYWlsZWQgPSBmYWxzZTsKCnZvaWQgcXNvcnRfd2l0aF9jaGVjayhpbnQgKmEsIGludCBsLCBpbnQgcikKewogICAgaWYgKGwgPj0gcikKICAgICAgICByZXR1cm47CiAgICBpbnQgeCA9IGFbKGwgKyByKSAvIDJdOwogICAgaW50IGkgPSBsLCBqID0gcjsKICAgIHdoaWxlIChpIDw9IGopCiAgICB7CiAgICAgICAgd2hpbGUgKGFbaV0gPCB4KSArK2k7CiAgICAgICAgd2hpbGUgKGFbal0gPiB4KSAtLWo7CiAgICAgICAgaWYgKGkgPD0gaikKICAgICAgICB7CiAgICAgICAgICAgIHN3YXAoYVtpXSwgYVtqXSk7CiAgICAgICAgICAgICsraSwgLS1qOwogICAgICAgIH0KICAgIH0KICAgIAogICAgaWYgKCEobCA+PSBqKSkKICAgIHsKICAgICAgICBjb3V0IDw8ICJNaXN0YWtlOiBoYXZlIG5vbi1lbXB0eSBmaXJzdCBzdWJ0YXNrISIgPDwgZW5kbDsKICAgICAgICBxc29ydF9jaGVja19mYWlsZWQgPSB0cnVlOwogICAgfQogICAgcXNvcnRfd2l0aF9jaGVjayhhLCBsLCBqKTsKICAgIHFzb3J0X3dpdGhfY2hlY2soYSwgaSwgcik7Cn0KCmludCBtYWluKCkKewoJY29uc3QgaW50IGxlbmd0aCA9IDI4OwoJaW50IGFbbGVuZ3RoXTsKCXByZXBhcmVfa2lsbGVyKGEsIGxlbmd0aCk7Cglxc29ydF93aXRoX2NoZWNrKGEsIDAsIGxlbmd0aCAtIDEpOwoJaWYgKCFxc29ydF9jaGVja19mYWlsZWQpCgkgICAgY291dCA8PCAia2lsbGVyIHNlcXVlbmNlIHN1Y2NlZWRlZCIgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9