#include <vector>
#include <algorithm>
#include <functional>
void quickSort(std::vector<long>& numberList, long low, long high)
{
struct lh { long low; long high; };
std::vector<lh> stack;
stack.push_back(lh{low, high});
while (!stack.empty())
{
lh popped = stack.back();
stack.pop_back();
low = popped.low;
high = popped.high;
long pivot, indexLow, indexHigh, temp;
if(low<high){
pivot = low;
indexLow = low;
indexHigh = high;
while(indexLow<indexHigh){
while(numberList[indexLow] <= numberList[pivot]){
indexLow++;
}
while(numberList[indexHigh] > numberList[pivot]){
indexHigh--;
}
if(indexLow<indexHigh){
temp = numberList[indexLow];
numberList[indexLow] = numberList[indexHigh];
numberList[indexHigh] = temp;
}
}
temp = numberList[pivot];
numberList[pivot] = numberList[indexHigh];
numberList[indexHigh] = temp;
//std::string s = std::accumulate(
// numberList.begin()+1, numberList.end(), std::to_string(numberList[0]),
// [](const std::string& a, auto& b) {
// return a + '-' + std::to_string(b);
// });
//printf("%s\n", s.c_str());
//printf("%d, %d, %d, %d, %d\n", low, indexLow, pivot, indexHigh, high);
//printf("left %d %d\n", low, indexHigh-1);
//quickSort(numberList, low, indexHigh-1);
stack.push_back(lh{low, indexHigh-1});
//printf("right %d %d\n", indexHigh+1, high);
//quickSort(numberList, indexHigh+1, high);
stack.push_back(lh{indexHigh+1, high});
//printf("end\n");
}
}
}
int main()
{
constexpr size_t count = 1'000'000;
std::vector<long> arr(count);
std::generate(arr.begin(), arr.end(), bind(std::uniform_int_distribution<>(0,count-1), std::mt19937()));
quickSort(arr, 0, count-1);
return std::is_sorted(arr.begin(), arr.end()) ? 0 : 1;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cgp2b2lkIHF1aWNrU29ydChzdGQ6OnZlY3Rvcjxsb25nPiYgbnVtYmVyTGlzdCwgbG9uZyBsb3csIGxvbmcgaGlnaCkKewoJc3RydWN0IGxoIHsgbG9uZyBsb3c7IGxvbmcgaGlnaDsgfTsKCXN0ZDo6dmVjdG9yPGxoPiBzdGFjazsKCXN0YWNrLnB1c2hfYmFjayhsaHtsb3csIGhpZ2h9KTsKCQoJd2hpbGUgKCFzdGFjay5lbXB0eSgpKQoJewoJCWxoIHBvcHBlZCA9IHN0YWNrLmJhY2soKTsKCQlzdGFjay5wb3BfYmFjaygpOwoJCWxvdyA9IHBvcHBlZC5sb3c7CgkJaGlnaCA9IHBvcHBlZC5oaWdoOwoJCQoJCWxvbmcgcGl2b3QsIGluZGV4TG93LCBpbmRleEhpZ2gsIHRlbXA7CgoJICAgIGlmKGxvdzxoaWdoKXsKCSAgICAgICAgcGl2b3QgPSBsb3c7CgkgICAgICAgIGluZGV4TG93ID0gbG93OwoJICAgICAgICBpbmRleEhpZ2ggPSBoaWdoOwoJCgkgICAgICAgIHdoaWxlKGluZGV4TG93PGluZGV4SGlnaCl7CgkgICAgICAgICAgICB3aGlsZShudW1iZXJMaXN0W2luZGV4TG93XSA8PSBudW1iZXJMaXN0W3Bpdm90XSl7CgkgICAgICAgICAgICBpbmRleExvdysrOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgd2hpbGUobnVtYmVyTGlzdFtpbmRleEhpZ2hdID4gbnVtYmVyTGlzdFtwaXZvdF0pewoJICAgICAgICAgICAgaW5kZXhIaWdoLS07CgkgICAgICAgICAgICB9CgkKCSAgICAgICAgICAgIGlmKGluZGV4TG93PGluZGV4SGlnaCl7CgkgICAgICAgICAgICAgICAgdGVtcCA9IG51bWJlckxpc3RbaW5kZXhMb3ddOwoJICAgICAgICAgICAgICAgIG51bWJlckxpc3RbaW5kZXhMb3ddID0gbnVtYmVyTGlzdFtpbmRleEhpZ2hdOwoJICAgICAgICAgICAgICAgIG51bWJlckxpc3RbaW5kZXhIaWdoXSA9IHRlbXA7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICB9CgkKCSAgICAgICAgdGVtcCA9IG51bWJlckxpc3RbcGl2b3RdOwoJICAgICAgICBudW1iZXJMaXN0W3Bpdm90XSA9IG51bWJlckxpc3RbaW5kZXhIaWdoXTsKCSAgICAgICAgbnVtYmVyTGlzdFtpbmRleEhpZ2hdID0gdGVtcDsKCQoJICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBzdGQ6OmFjY3VtdWxhdGUoCgkgICAgICAgIC8vCW51bWJlckxpc3QuYmVnaW4oKSsxLCBudW1iZXJMaXN0LmVuZCgpLCBzdGQ6OnRvX3N0cmluZyhudW1iZXJMaXN0WzBdKSwKCSAgICAgICAgLy8gICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmIGEsIGF1dG8mIGIpIHsKCSAgICAgICAgLy8gICAgICAgIHJldHVybiBhICsgJy0nICsgc3RkOjp0b19zdHJpbmcoYik7CgkgICAgICAgIC8vICAgIH0pOwoJICAgICAgICAvL3ByaW50ZigiJXNcbiIsIHMuY19zdHIoKSk7CgkgICAgICAgIC8vcHJpbnRmKCIlZCwgJWQsICVkLCAlZCwgJWRcbiIsIGxvdywgaW5kZXhMb3csIHBpdm90LCBpbmRleEhpZ2gsIGhpZ2gpOwoJCgkgICAgICAgIC8vcHJpbnRmKCJsZWZ0ICVkICVkXG4iLCBsb3csIGluZGV4SGlnaC0xKTsKCSAgICAgICAgLy9xdWlja1NvcnQobnVtYmVyTGlzdCwgbG93LCBpbmRleEhpZ2gtMSk7CgkgICAgICAgIHN0YWNrLnB1c2hfYmFjayhsaHtsb3csIGluZGV4SGlnaC0xfSk7CgkKCSAgICAgICAgLy9wcmludGYoInJpZ2h0ICVkICVkXG4iLCBpbmRleEhpZ2grMSwgaGlnaCk7CgkgICAgICAgIC8vcXVpY2tTb3J0KG51bWJlckxpc3QsIGluZGV4SGlnaCsxLCBoaWdoKTsKCSAgICAgICAgc3RhY2sucHVzaF9iYWNrKGxoe2luZGV4SGlnaCsxLCBoaWdofSk7CgkKCSAgICAgICAgLy9wcmludGYoImVuZFxuIik7CgkgICAgfQoJfQp9CgppbnQgbWFpbigpCnsKCWNvbnN0ZXhwciBzaXplX3QgY291bnQgPSAxJzAwMCcwMDA7CglzdGQ6OnZlY3Rvcjxsb25nPiBhcnIoY291bnQpOwoJc3RkOjpnZW5lcmF0ZShhcnIuYmVnaW4oKSwgYXJyLmVuZCgpLCBiaW5kKHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4oMCxjb3VudC0xKSwgc3RkOjptdDE5OTM3KCkpKTsKCXF1aWNrU29ydChhcnIsIDAsIGNvdW50LTEpOwoJcmV0dXJuIHN0ZDo6aXNfc29ydGVkKGFyci5iZWdpbigpLCBhcnIuZW5kKCkpID8gMCA6IDE7Cn0K