#include <iostream>
#include <vector>
using namespace std;
const int N = (int)20;
int a[N];
void merge(int start, vector<int> v1, vector<int> v2) {
int i = 0, j = 0;
while(i < v1.size() && j < v2.size()) {
if (v1[i] <= v2[j]) a[start++] = v1[i++];
else a[start++] = v2[j++];
}
while(i < v1.size()) a[start++] = v1[i++];
while(j < v2.size()) a[start++] = v2[j++];
}
void merge_sort(int left, int right) {
if (left >= right) return;
int mid = (left + right) / 2;
vector<int> l, r;
merge_sort(left, mid);
merge_sort(mid + 1, right);
for(int i = left; i <= mid; i++) l.push_back(a[i]);
for(int i = mid+1; i <= right; i++) r.push_back(a[i]);
merge(left, l, r);
}
bool is_sorted() {
for(int i = 0; i < N - 1; i++) if (a[i] > a[i + 1]) return false;
return true;
}
int main() {
for(int i =0 ; i < N; i++) a[i] = rand() % 1001;
merge_sort(0, N - 1);
cout << "sorted: " << is_sorted() << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOID0gKGludCkyMDsKCmludCBhW05dOwoKdm9pZCBtZXJnZShpbnQgc3RhcnQsIHZlY3RvcjxpbnQ+IHYxLCB2ZWN0b3I8aW50PiB2MikgewogIGludCBpID0gMCwgaiA9IDA7CgogIHdoaWxlKGkgPCB2MS5zaXplKCkgJiYgaiA8IHYyLnNpemUoKSkgewogICAgaWYgKHYxW2ldIDw9IHYyW2pdKSBhW3N0YXJ0KytdID0gdjFbaSsrXTsKICAgIGVsc2UgYVtzdGFydCsrXSA9IHYyW2orK107CiAgfQoKICB3aGlsZShpIDwgdjEuc2l6ZSgpKSBhW3N0YXJ0KytdID0gdjFbaSsrXTsKICB3aGlsZShqIDwgdjIuc2l6ZSgpKSBhW3N0YXJ0KytdID0gdjJbaisrXTsKfQoKdm9pZCBtZXJnZV9zb3J0KGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKICBpZiAobGVmdCA+PSByaWdodCkgcmV0dXJuOwoKICBpbnQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOwoKICB2ZWN0b3I8aW50PiBsLCByOwoKICBtZXJnZV9zb3J0KGxlZnQsIG1pZCk7CiAgbWVyZ2Vfc29ydChtaWQgKyAxLCByaWdodCk7CgogIGZvcihpbnQgaSA9IGxlZnQ7IGkgPD0gbWlkOyBpKyspIGwucHVzaF9iYWNrKGFbaV0pOwogIGZvcihpbnQgaSA9IG1pZCsxOyBpIDw9IHJpZ2h0OyBpKyspIHIucHVzaF9iYWNrKGFbaV0pOwoKICBtZXJnZShsZWZ0LCBsLCByKTsKfQoKYm9vbCBpc19zb3J0ZWQoKSB7CiAgZm9yKGludCBpID0gMDsgaSA8IE4gLSAxOyBpKyspIGlmIChhW2ldID4gYVtpICsgMV0pIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKSB7CiAgZm9yKGludCBpID0wIDsgaSA8IE47IGkrKykgYVtpXSA9IHJhbmQoKSAlIDEwMDE7CgogIG1lcmdlX3NvcnQoMCwgTiAtIDEpOwoKICBjb3V0IDw8ICJzb3J0ZWQ6ICIgPDwgaXNfc29ydGVkKCkgPDwgZW5kbDsKfQo=