template <typename T> voidquick_sort(T *arr, int l, int r){
if (l >= r) return; int x = arr[l + r >> 1]; int i = l - 1, j = r + 1; while (i < j){ while (arr[++i] < x) ; while (arr[--j] > x) ; if (i < j) swap(arr[i], arr[j]); }
template <typename T> voidmerge_sort(T *arr, int l, int r){ T *tmp = new T[r - l + 1]; m_sort<int>(arr, tmp, l, r); delete tmp; } template <typename T> voidm_sort(T *arr, T *tmp, int l ,int r){ if (l >= r) return; int mid = l + r >> 1; m_sort<T>(arr, tmp, l, mid); m_sort<T>(arr, tmp, mid + 1, r);
int k = l; int i = l, j = mid + 1; while (i <= mid && j <= r){ if (arr[i] <= arr[j]) tmp[k++] = arr[i++]; else tmp[k++] = arr[j++]; } while (i <= mid) tmp[k++] = arr[i++]; while (j <= r) tmp[k++] = arr[j++]; for (int i = l; i <= r; i++) arr[i] = tmp[i]; }