← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

var (
	n     int
	k     int64
	a     []int
	rank  []int
	P     []int64
	S     []int64
	maxn  int
	tree1 []int64
	tree2 []int64
	tstamp1 []int
	tstamp2 []int
	curr_time int
)

func main() {
	in := bufio.NewScanner(os.Stdin)
	in.Split(bufio.ScanWords)
	fmt.Scan(&n, &k)
	a = make([]int, n+1)
	rank = make([]int, n+1)
	P = make([]int64, n+1)
	S = make([]int64, n+2)
	var all []int = make([]int, n)
	for i := 1; i <= n; i++ {
		fmt.Scan(&a[i])
		all[i-1] = a[i]
	}
	sort.Ints(all)
	var unique []int
	for i := 0; i < n; i++ {
		if i == 0 || all[i] != all[i-1] {
			unique = append(unique, all[i])
		}
	}
	maxn = len(unique)
	for i := 1; i <= n; i++ {
		rank[i] = sort.SearchInts(unique, a[i]) + 1
	}
	computeP()
	computeS()
	tree1 = make([]int64, maxn+10)
	tree2 = make([]int64, maxn+10)
	tstamp1 = make([]int, maxn+10)
	tstamp2 = make([]int, maxn+10)
	fmt.Println(solve(1, n))
}

func computeP() {
	tmp_tree := make([]int64, maxn+10)
	tmp_update := func(pos int, val int64) {
		for pos <= maxn {
			tmp_tree[pos] += val
			pos += pos & -pos
		}
	}
	tmp_query := func(pos int) int64 {
		var res int64
		for pos > 0 {
			res += tmp_tree[pos]
			pos -= pos & -pos
		}
		return res
	}
	P[0] = 0
	for i := 1; i <= n; i++ {
		added := tmp_query(maxn) - tmp_query(rank[i])
		P[i] = P[i-1] + added
		tmp_update(rank[i], 1)
	}
}

func computeS() {
	tmp_tree := make([]int64, maxn+10)
	tmp_update := func(pos int, val int64) {
		for pos <= maxn {
			tmp_tree[pos] += val
			pos += pos & -pos
		}
	}
	tmp_query := func(pos int) int64 {
		var res int64
		for pos > 0 {
			res += tmp_tree[pos]
			pos -= pos & -pos
		}
		return res
	}
	S[n+1] = 0
	for i := n; i >= 1; i-- {
		added := tmp_query(rank[i]-1)
		S[i] = S[i+1] + added
		tmp_update(rank[i], 1)
	}
}

func update1(pos int, val int64) {
	for p := pos; p <= maxn; p += p & -p {
		if tstamp1[p] != curr_time {
			tree1[p] = 0
			tstamp1[p] = curr_time
		}
		tree1[p] += val
	}
}

func query1(pos int) int64 {
	var sum int64
	for p := pos; p > 0; p -= p & -p {
		if tstamp1[p] != curr_time {
			tree1[p] = 0
			tstamp1[p] = curr_time
		}
		sum += tree1[p]
	}
	return sum
}

func update2(pos int, val int64) {
	for p := pos; p <= maxn; p += p & -p {
		if tstamp2[p] != curr_time {
			tree2[p] = 0
			tstamp2[p] = curr_time
		}
		tree2[p] += val
	}
}

func query2(pos int) int64 {
	var sum int64
	for p := pos; p > 0; p -= p & -p {
		if tstamp2[p] != curr_time {
			tree2[p] = 0
			tstamp2[p] = curr_time
		}
		sum += tree2[p]
	}
	return sum
}

func solve(L, R int) int64 {
	if L >= R {
		return 0
	}
	mid := (L + R) / 2
	ans := solve(L, mid) + solve(mid+1, R)
	curr_time++
	var current_cross int64
	pointer := mid
	for i := L; i <= mid; i++ {
		update1(rank[i], 1)
	}
	for rr := R; rr >= mid+1; rr-- {
		update2(rank[rr], 1)
		addd := query1(maxn) - query1(rank[rr])
		current_cross += addd
		for pointer >= L && P[pointer]+S[rr]+current_cross > k {
			subb := query2(rank[pointer]-1)
			current_cross -= subb
			update1(rank[pointer], -1)
			pointer--
		}
		ans += int64(pointer - L + 1)
	}
	return ans
}
```