← Home
```go
package main

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

type BIT struct {
	n int
	f []int64
}

func NewBIT(n int) *BIT {
	return &BIT{n: n, f: make([]int64, n+2)}
}

func (b *BIT) Add(i int, v int64) {
	for i <= b.n {
		b.f[i] += v
		i += i & -i
	}
}

func (b *BIT) Sum(i int) int64 {
	var s int64
	for i > 0 {
		s += b.f[i]
		i -= i & -i
	}
	return s
}

func minInt64(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	var n int
	fmt.Fscan(in, &n)
	a := make([]int64, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &a[i])
	}

	keys := make([]int64, n)
	for i := 0; i < n; i++ {
		keys[i] = minInt64(int64(i+1), a[i])
	}
	comp := append([]int64(nil), keys...)
	sort.Slice(comp, func(i, j int) bool { return comp[i] < comp[j] })
	comp = unique(comp)

	rank := make([]int, n)
	for i := 0; i < n; i++ {
		rank[i] = sort.Search(len(comp), func(j int) bool { return comp[j] >= keys[i] }) + 1
	}

	bit := NewBIT(len(comp))
	var ans int64
	for i := n - 1; i >= 0; i-- {
		ans += bit.Sum(rank[i])
		bit.Add(rank[i], 1)
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprintln(out, ans)
	out.Flush()
}

func unique(a []int64) []int64 {
	if len(a) == 0 {
		return a
	}
	j := 1
	for i := 1; i < len(a); i++ {
		if a[i] != a[i-1] {
			a[j] = a[i]
			j++
		}
	}
	return a[:j]
}
```