Verified here: https://www.geeksforgeeks.org/problems/merge-sort/1

class Solution {
  public:
    void merge(vector<int>& arr, int l, int m, int r) {
        int total = r-l+1;
        int n1 = m-l+1;
        int n2 = total-n1;
        
        vector<int> left;
        vector<int> right;
            
        for (int i = l; i <= r; i++) {
            if (i <= m) {
                left.push_back(arr[i]);
            } else {
                right.push_back(arr[i]);
            }
        }
        
        int start = l;
        int i = 0;
        int j = 0;
        
        while(i < n1 && j < n2) {
            if (left[i] < right[j]) {
                arr[start] = left[i];
                i++;
            }else {
                arr[start] = right[j];
                j++;
            }
            start++;
        }
        while(i < n1) {
            arr[start] = left[i];
            i++;
            start++;
        }
        
        while(j < n2) {
            arr[start] = right[j];
            j++;
            start++;
        }
    }
    void mergeSort(vector<int>& arr, int l, int r) {
        // code here
        if (l < r) {
            int m = l+(r-l)/2;
            mergeSort(arr, l, m);
            mergeSort(arr, m+1, r);
            merge(arr, l, m, r);
        }
    }
};