```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]
}
```