#include <iostream>
#include <vector>
using namespace std;
const int N = (int)20;
int a[N];
vector<int> aux;
void merge(vector<int> v1, vector<int> v2) {
int i = 0, j = 0;
while(i < v1.size() && j < v2.size()) {
if (v1[i] <= v2[j]) aux.push_back(v1[i++]);
else aux.push_back(v2[j++]);
}
while(i < v1.size()) aux.push_back(v1[i++]);
while(j < v2.size()) aux.push_back(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]);
aux.clear();
merge(l, r);
for(int i = left; i <= right; i++) {
a[i] = aux[i - left];
}
}
int main() {
for(int i =0 ; i < N; i++) {
a[i] = rand() % 1001;
if (i < 20)
cout << a[i] << " ";
}
cout << endl << endl << endl;
merge_sort(0, N - 1);
for(int i = 0; i < 20; i++) {
cout << a[i] << " ";
}
cout << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOID0gKGludCkyMDsKCmludCBhW05dOwp2ZWN0b3I8aW50PiBhdXg7Cgp2b2lkIG1lcmdlKHZlY3RvcjxpbnQ+IHYxLCB2ZWN0b3I8aW50PiB2MikgewogIGludCBpID0gMCwgaiA9IDA7CgogIHdoaWxlKGkgPCB2MS5zaXplKCkgJiYgaiA8IHYyLnNpemUoKSkgewogICAgaWYgKHYxW2ldIDw9IHYyW2pdKSBhdXgucHVzaF9iYWNrKHYxW2krK10pOwogICAgZWxzZSBhdXgucHVzaF9iYWNrKHYyW2orK10pOwogIH0KCiAgd2hpbGUoaSA8IHYxLnNpemUoKSkgYXV4LnB1c2hfYmFjayh2MVtpKytdKTsKICB3aGlsZShqIDwgdjIuc2l6ZSgpKSBhdXgucHVzaF9iYWNrKHYyW2orK10pOwp9Cgp2b2lkIG1lcmdlX3NvcnQoaW50IGxlZnQsIGludCByaWdodCkgewogIGlmIChsZWZ0ID49IHJpZ2h0KSByZXR1cm47CgogIGludCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CgogIHZlY3RvcjxpbnQ+IGwsIHI7CgogIG1lcmdlX3NvcnQobGVmdCwgbWlkKTsKICBtZXJnZV9zb3J0KG1pZCArIDEsIHJpZ2h0KTsKCiAgZm9yKGludCBpID0gbGVmdDsgaSA8PSBtaWQ7IGkrKykgbC5wdXNoX2JhY2soYVtpXSk7CiAgZm9yKGludCBpID0gbWlkKzE7IGkgPD0gcmlnaHQ7IGkrKykgci5wdXNoX2JhY2soYVtpXSk7CgogIGF1eC5jbGVhcigpOwogIG1lcmdlKGwsIHIpOwoKICBmb3IoaW50IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHsKICAgIGFbaV0gPSBhdXhbaSAtIGxlZnRdOwogIH0KCn0KCmludCBtYWluKCkgewogIGZvcihpbnQgaSA9MCA7IGkgPCBOOyBpKyspIHsKICAgIGFbaV0gPSByYW5kKCkgJSAxMDAxOwoKICAgIGlmIChpIDwgMjApCiAgICAgIGNvdXQgPDwgYVtpXSA8PCAiICI7CiAgfQogIGNvdXQgPDwgZW5kbCA8PCBlbmRsIDw8IGVuZGw7CgogIG1lcmdlX3NvcnQoMCwgTiAtIDEpOwoKICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgY291dCA8PCBhW2ldIDw8ICIgIjsKICB9CiAgY291dCA8PCBlbmRsOwp9Cg==