int partition(vector<int> &arr, int l, int r)
{
int key = arr[r];
int i = l-1;
for(int j = l; j <= r-1; j++){
if(arr[j] <= key){
i++;
swap(arr[j], arr[i]);
}
}
swap(arr[i+1], arr[r]);
return i+1;
}
void my_qsort(vector<int> &arr, int l, int r)
{
if(l < r) {
int m = partition(arr, l, r);
my_qsort(arr, l, m - 1);
my_qsort(arr, m + 1, r);
}
}
void QuikSort(int *a, int left, int right)
{
if(left < right){
int key = a[left];
int low = left;
int high = right;
while(low < high){
while(low < high && a[high] >= key)
high--;
a[low] = a[high];
while(low < high && a[low] <= key)
low++;
a[high] = a[low];
}
a[low] = key;
QuikSort(a, left, low-1);
QuikSort(a, low+1, right);
}
}