#include <stdio.h>
#include <omp.h>
void merge(int arr[], int l, int m, int r) {
int i = l, j = m+1, k = 0;
int temp[100000];
while(i <= m && j <= r) {
if(arr[i] < arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while(i <= m) temp[k++] = arr[i++];
while(j <= r) temp[k++] = arr[j++];
for(i = l, k = 0; i <= r; i++, k++)
arr[i] = temp[k];
}
void mergeSort(int arr[], int l, int r) {
if(l < r) {
int m = (l + r) / 2;
#pragma omp task
mergeSort(arr, l, m);
#pragma omp task
mergeSort(arr, m+1, r);
#pragma omp taskwait
merge(arr, l, m, r);
}
}
int main() {
int arr[10000];
// fill array
for(int i = 0; i < 10000; i++)
#pragma omp parallel
{
#pragma omp single
mergeSort(arr, 0, 9999);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxvbXAuaD4KCnZvaWQgbWVyZ2UoaW50IGFycltdLCBpbnQgbCwgaW50IG0sIGludCByKSB7CiAgICBpbnQgaSA9IGwsIGogPSBtKzEsIGsgPSAwOwogICAgaW50IHRlbXBbMTAwMDAwXTsKCiAgICB3aGlsZShpIDw9IG0gJiYgaiA8PSByKSB7CiAgICAgICAgaWYoYXJyW2ldIDwgYXJyW2pdKSB0ZW1wW2srK10gPSBhcnJbaSsrXTsKICAgICAgICBlbHNlIHRlbXBbaysrXSA9IGFycltqKytdOwogICAgfQoKICAgIHdoaWxlKGkgPD0gbSkgdGVtcFtrKytdID0gYXJyW2krK107CiAgICB3aGlsZShqIDw9IHIpIHRlbXBbaysrXSA9IGFycltqKytdOwoKICAgIGZvcihpID0gbCwgayA9IDA7IGkgPD0gcjsgaSsrLCBrKyspCiAgICAgICAgYXJyW2ldID0gdGVtcFtrXTsKfQoKdm9pZCBtZXJnZVNvcnQoaW50IGFycltdLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmKGwgPCByKSB7CiAgICAgICAgaW50IG0gPSAobCArIHIpIC8gMjsKCiAgICAgICAgI3ByYWdtYSBvbXAgdGFzawogICAgICAgIG1lcmdlU29ydChhcnIsIGwsIG0pOwoKICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCiAgICAgICAgbWVyZ2VTb3J0KGFyciwgbSsxLCByKTsKCiAgICAgICAgI3ByYWdtYSBvbXAgdGFza3dhaXQKICAgICAgICBtZXJnZShhcnIsIGwsIG0sIHIpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGludCBhcnJbMTAwMDBdOwoKICAgIC8vIGZpbGwgYXJyYXkKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQogICAgICAgIGFycltpXSA9IHJhbmQoKSAlIDEwMDA7CgogICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKICAgIHsKICAgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUKICAgICAgICBtZXJnZVNvcnQoYXJyLCAwLCA5OTk5KTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==