function sort(arr,l=0,r=arr.length-1){
for(let i=l; i<r; i++){
for(let j=r; j>i; j--){
if(arr[j]<arr[j-1]) swap(arr,j,j-1)
}
}
}
function sort(arr,l=0,r=arr.length-1){
for(let i=min=l; min = i,i<r; i++){
for(let j=r; j>i; j--){
if(arr[j]<arr[min]) j=min
}
swap(arr,i,min)
}
}
function sort(arr,l=0,r=arr.length-1){
for(let i=l; i<r; i++){
for(let j=i+1;j>l;j--){
if(arr[j]<arr[j-1]) swap(arr,j,j-1)
else break
}
}
}
function sort(arr,l=0,r=arr.length-1,m=(l+r)>>1){
if(l>=r) return
sort(arr,l,m)
sort(arr,m+1,r)
merge(arr,l,m,r)
}
function merge(arr,l,m,r){
let helpArr = []
let p1=l
let p2=m+1
while(p1<=m&&p2<=r) helpArr.push(arr[p1]<arr[p2]?arr[p1++]:arr[p2++])
while(p1<=m) helpArr.push(arr[p1++])
while(p2<=r) helpArr.push(arr[p2++])
while(l<=r) arr[l++] = helpArr.shift()
}
function sort(arr,l=0,r=arr.length-1,m = (l+r)>>1){
if(l>=r) return 0
return sort(arr,l,m) + sort(arr,m+1,r)+merge(arr,l,m,r)
}
function merge(arr,l,m,r){
let count = 0
let helpArr = []
let p1 = l
let p2 = m+1
while(p1<=m&&p2<=r){
if(arr[p1]<arr[p2]){
count+= (r-p2+1)*arr[p1]
helpArr.push(arr[p1++])
}
else {
helpArr.push(arr[p2++])
}
}
while(p1<=m) helpArr.push(arr[p1++])
while(p2<=r) helpArr.push(arr[p2++])
while(l<=r) arr[l++] = helpArr.shift()
return count
}
function partition(arr, n, l=0, r=arr.length-1) {
let min = l-1
let max = r+1
while (l < max) {
if (arr[l] < n) swap(arr, l++, ++min)
else if (arr[i] > n) swap(arr, l, --max)
else l++
}
}
function sort(arr, l=0, r=arr.length-1) {
if(l>=r) return
let [min, max] = partition(arr, l, r)
sort(arr, l, min)
sort(arr,max,r)
}
function partition(arr,l,r) {
let min = l - 1
let max = r + 1
let p = arr[(r+l)>>1]
while (l < max) {
if (arr[l] < p) swap(arr, ++min, l++)
else if (arr[l] > p) swap(arr, --max, l)
else l++
}
return [min, max]
}
function heapSort(arr,l=0,r=arr.length-1) {
if(l>=r) return
for(let i=l;i<=r;i++) heapInsert(arr,i)
swap(arr,l,r--)
while(r>l){
heapify(arr,l,r)
swap(arr,l,r--)
}
}
function heapify(arr,i,hs) {
while(i*2+1<=hs){
let max = i*2+2<=hs&&arr[i*2+2]>arr[i*2+1] ? i*2+2 : i*2+1
if(arr[i]<arr[max]){
swap(arr,i,max)
i = max
}
else break
}
}
function heapInsert(arr,i){
while(i>0&&arr[i]>arr[(i-1)>>1]){
swap(arr,i,(i-1)>>1)
i = (i-1)>>1
}
}
function sort(arr,l=0,r=arr.length-1) {
if (arr.length < 2) return
let bit = getMaxBit(arr, l, r)
let radix = 10
let help = []
let count =[]
let i = d = 0
for (d = 1; d <= bit; d++){
count = new Array(radix).fill(0)
for (i = l; i <= r; i++) count[getDigit(arr[i], d)]++
for (i = 1; i < radix; i++) count[i] += count[i - 1]
for (i = r; i >= l; i--) help[--count[getDigit(arr[i], d)]] = arr[i]
for (i = l; i <= r; i++) arr[i] = help.shift()
}
}
function getMaxBit(arr,l,r) {
let maxNum = arr[l++]
while (l <= r) maxNum = Math.max(arr[l++], maxNum)
return String(maxNum).length
}
function getDigit(n,d) {
return Math.floor(n / Math.pow(10, d - 1)) % 10
}
function binarySearch(arr,n,l=0,r=arr.length-1){
let m = 0
while(l<=r){
m = (r+l)>>1
if(n<arr[m]) r = m-1
else if(n>arr[m]) l = m+1
else return m
}
return -1
}
function getSingleNum(arr){
let res = 0
for(let i =0;i<arr.length;i++) res^=arr[i]
return res
}
function getSingleNums(arr){
let temp = 0
arr.forEach(num=>temp^=num)
let temp2 = temp&(~temp+1)
let res1 = 0
let res2 = 0
arr.forEach(num=>{
if(num&temp2==1) res1^=num
else res2^=num
})
return [res1,res2]
}