void merge(vector<int> &arr, int left, int mid, int right) {
int lpos = left;
int rpos = mid + 1;
int poss = left;
int i = 0;
vector<int> tempArr;
while (lpos <= mid && rpos <= right) {
if (arr[lpos] < arr[rpos]) {
tempArr.push_back(arr[lpos++]);
}
else {
tempArr.push_back(arr[rpos++]);
}
}
while (lpos <= mid) {
tempArr.push_back(arr[lpos++]);
}
while (rpos <= right) {
tempArr.push_back(arr[rpos++]);
}
while (left <= right) {
arr[left] = tempArr[i];
i++;
left++;
}
}
void mSort(vector<int> &arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mSort(arr, left, mid);
mSort(arr, mid+1, right);
merge(arr, left, mid, right);
}
}
void mergeSort(vector<int> &arr) {
mSort(arr, 0, arr.size() - 1);
}