public static void mergeSort(int[] arr, int l, int r) {
if (r <= l) return;
int m = (l + r) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, r);
}
static void merge(int[] arr, int l, int r) {
int m = (l + r) / 2;
int[] tmp = new int[r - l + 1];
int i = l, j = m + 1, k = 0;
while (i <= m && j <= r)
tmp[k ++] = arr[i] <= arr[j] ? arr[i ++] : arr[j ++];
while (i <= m) tmp[k ++] = arr[i ++];
while (j <= r) tmp[k ++] = arr[j ++];
for (i = l, k = 0; i <= r; ++i, ++k)
arr[i] = tmp[k];
}