//Title of this code
#include <iostream>
using namespace std;
int map[] =
{
0, 2, 3, 2, 0,
0, 1, 4, 0, 1,
1, 2, 2, 0, 3,
2, 1, 0, 0, 4,
4, 3, 1, 1, 3
};
void mergeSortBlock(int *a, int index1, int index2, int size, int transparent);
void mergeSort(int *a, int indexFront,int indexEnd, int transparent);
void printMap();
int main()
{
int size = sizeof(map) / sizeof(map[0]);
cout << "size = " << size << std::endl;
cout << "before\n";
printMap();
mergeSort(map,0, size, 0);
cout << "after\n";
printMap();
return 0;
}
void mergeSortBlock(int *a, int index1, int index2, int size, int transparent)
{
int *result;
int resultIndex = 0;
int mergeIndex1 = index1;
int mergeIndex2 = index2;
result = new int [size*2];
while (mergeIndex1 <= (index1 + size -1) && mergeIndex2 <= (index2 + size -1)){
if (a[mergeIndex2] == transparent) { // check the transparency
result[resultIndex] = a[mergeIndex2];
resultIndex++;
mergeIndex2++;
}
else {
result[resultIndex] = a[mergeIndex1];
resultIndex++;
mergeIndex1++;
}
}
if (mergeIndex2 <= (index2 + size - 1)) {
for (int i = mergeIndex2 ; i< (index2 + size); i++) {
result[resultIndex] = a[mergeIndex2];
resultIndex++;
mergeIndex2++;
}
}
else{
for (int i = mergeIndex1 ; i< (index1 + size); i++) {
result[resultIndex] = a[mergeIndex1];
resultIndex++;
mergeIndex1++;
}
}
// copy the result back
for (int i=0; i < size*2; i++) {
a[index1+i] = result[i];
}
delete [] result;
}
void mergeSort(int *a, int indexFront,int indexEnd, int transparent){
int size = (indexEnd - indexFront +1)/2;
if (size > 1){
mergeSort(a, indexFront, indexFront + size - 1, transparent);
mergeSort(a, indexFront + size, indexEnd, transparent);
}
mergeSortBlock(a, indexFront, indexFront + size, size, transparent);
}
void printMap()
{
for (int row = 0;row < 5; ++row)
{
for (int col = 0;col < 5; ++col)
{
cout << map[5 * row + col] << '\t';
}
cout << endl << endl << endl << endl;
}
}
Ly9UaXRsZSBvZiB0aGlzIGNvZGUKCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYXBbXSA9CnsKICAgIDAsIDIsIDMsIDIsIDAsCiAgICAwLCAxLCA0LCAwLCAxLAogICAgMSwgMiwgMiwgMCwgMywKICAgIDIsIDEsIDAsIDAsIDQsCiAgICA0LCAzLCAxLCAxLCAzCn07Cgp2b2lkIG1lcmdlU29ydEJsb2NrKGludCAqYSwgaW50IGluZGV4MSwgaW50IGluZGV4MiwgaW50IHNpemUsIGludCB0cmFuc3BhcmVudCk7CnZvaWQgbWVyZ2VTb3J0KGludCAqYSwgaW50IGluZGV4RnJvbnQsaW50IGluZGV4RW5kLCBpbnQgdHJhbnNwYXJlbnQpOwp2b2lkIHByaW50TWFwKCk7CgppbnQgbWFpbigpCnsgCiAgICBpbnQgc2l6ZSA9IHNpemVvZihtYXApIC8gc2l6ZW9mKG1hcFswXSk7CiAgICAKICAgIGNvdXQgPDwgInNpemUgPSAiIDw8IHNpemUgPDwgc3RkOjplbmRsOwoKICAgICAgIAogICAgY291dCA8PCAiYmVmb3JlXG4iOwogICAgcHJpbnRNYXAoKTsKICAgIAogICAgbWVyZ2VTb3J0KG1hcCwwLCBzaXplLCAwKTsKICAgICAgIAogICAgY291dCA8PCAiYWZ0ZXJcbiI7CiAgICBwcmludE1hcCgpOwogICAgCiAgICByZXR1cm4gMDsKICAgIAp9Cgp2b2lkIG1lcmdlU29ydEJsb2NrKGludCAqYSwgaW50IGluZGV4MSwgaW50IGluZGV4MiwgaW50IHNpemUsIGludCB0cmFuc3BhcmVudCkKewogICAgaW50ICpyZXN1bHQ7CiAgICBpbnQgcmVzdWx0SW5kZXggPSAwOwogICAgaW50IG1lcmdlSW5kZXgxID0gaW5kZXgxOwogICAgaW50IG1lcmdlSW5kZXgyID0gaW5kZXgyOwoKICAgIHJlc3VsdCA9IG5ldyBpbnQgW3NpemUqMl07CgogICAgd2hpbGUgKG1lcmdlSW5kZXgxIDw9IChpbmRleDEgKyBzaXplIC0xKSAmJiBtZXJnZUluZGV4MiA8PSAoaW5kZXgyICsgc2l6ZSAtMSkpewogICAgICAgIGlmIChhW21lcmdlSW5kZXgyXSA9PSB0cmFuc3BhcmVudCkgeyAgLy8gY2hlY2sgdGhlIHRyYW5zcGFyZW5jeQogICAgICAgICAgICByZXN1bHRbcmVzdWx0SW5kZXhdID0gYVttZXJnZUluZGV4Ml07CiAgICAgICAgICAgIHJlc3VsdEluZGV4Kys7CiAgICAgICAgICAgIG1lcmdlSW5kZXgyKys7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXN1bHRbcmVzdWx0SW5kZXhdID0gYVttZXJnZUluZGV4MV07CiAgICAgICAgICAgIHJlc3VsdEluZGV4Kys7CiAgICAgICAgICAgIG1lcmdlSW5kZXgxKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChtZXJnZUluZGV4MiA8PSAoaW5kZXgyICsgc2l6ZSAtIDEpKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IG1lcmdlSW5kZXgyIDsgaTwgKGluZGV4MiArIHNpemUpOyBpKyspIHsKICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdEluZGV4XSA9IGFbbWVyZ2VJbmRleDJdOwogICAgICAgICAgICByZXN1bHRJbmRleCsrOwogICAgICAgICAgICBtZXJnZUluZGV4MisrOyAgICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgZWxzZXsKICAgICAgICBmb3IgKGludCBpID0gbWVyZ2VJbmRleDEgOyBpPCAoaW5kZXgxICsgc2l6ZSk7IGkrKykgewogICAgICAgICAgICByZXN1bHRbcmVzdWx0SW5kZXhdID0gYVttZXJnZUluZGV4MV07CiAgICAgICAgICAgIHJlc3VsdEluZGV4Kys7CiAgICAgICAgICAgIG1lcmdlSW5kZXgxKys7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGNvcHkgdGhlIHJlc3VsdCBiYWNrCiAgICBmb3IgKGludCBpPTA7IGkgPCBzaXplKjI7IGkrKykgewogICAgICAgIGFbaW5kZXgxK2ldID0gcmVzdWx0W2ldOwogICAgfSAgICAgICAKICAgIGRlbGV0ZSBbXSByZXN1bHQ7Cn0KCgp2b2lkIG1lcmdlU29ydChpbnQgKmEsIGludCBpbmRleEZyb250LGludCBpbmRleEVuZCwgaW50IHRyYW5zcGFyZW50KXsKICAgIGludCBzaXplID0gKGluZGV4RW5kIC0gaW5kZXhGcm9udCArMSkvMjsKICAgIGlmIChzaXplID4gMSl7CiAgICAgICAgbWVyZ2VTb3J0KGEsIGluZGV4RnJvbnQsIGluZGV4RnJvbnQgKyBzaXplIC0gMSwgdHJhbnNwYXJlbnQpOyAKICAgICAgICBtZXJnZVNvcnQoYSwgaW5kZXhGcm9udCArIHNpemUsIGluZGV4RW5kLCB0cmFuc3BhcmVudCk7CiAgICB9CiAgICBtZXJnZVNvcnRCbG9jayhhLCBpbmRleEZyb250LCBpbmRleEZyb250ICsgc2l6ZSwgc2l6ZSwgdHJhbnNwYXJlbnQpOwp9Cgp2b2lkIHByaW50TWFwKCkKewogICAgZm9yIChpbnQgcm93ID0gMDtyb3cgPCA1OyArK3JvdykKICAgIHsKICAgICAgICBmb3IgKGludCBjb2wgPSAwO2NvbCA8IDU7ICsrY29sKQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCBtYXBbNSAqIHJvdyArIGNvbF0gPDwgJ1x0JzsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBlbmRsIDw8IGVuZGwgPDwgZW5kbCA8PCBlbmRsOwogICAgfQp9