package main
import (
"bufio"
"io"
"os"
"sort"
"strconv"
)
type Item struct {
val int64
idx int
}
type Pair struct {
u int
v int
}
func main() {
data, _ := io.ReadAll(os.Stdin)
pos := 0
nextInt := func() int {
for pos < len(data) && (data[pos] == ' ' || data[pos] == '\n' || data[pos] == '\r' || data[pos] == '\t') {
pos++
}
sign := 1
if pos < len(data) && data[pos] == '-' {
sign = -1
pos++
}
val := 0
for pos < len(data) && data[pos] >= '0' && data[pos] <= '9' {
val = val*10 + int(data[pos]-'0')
pos++
}
return sign * val
}
n := nextInt()
items := make([]Item, n)
for i := 0; i < n; i++ {
items[i] = Item{val: int64(nextInt()), idx: i}
}
sortedItems := make([]Item, n)
copy(sortedItems, items)
sort.Slice(sortedItems, func(i, j int) bool {
if sortedItems[i].val != sortedItems[j].val {
return sortedItems[i].val < sortedItems[j].val
}
return sortedItems[i].idx < sortedItems[j].idx
})
rank := make([]int, n)
for i, it := range sortedItems {
rank[it.idx] = i + 1
}
ans := make([]Pair, 0, n*(n-1)/2)
tmp := make([]int, 0, n)
for j := n - 1; j >= 0; j-- {
tmp = tmp[:0]
for i := 0; i < j; i++ {
if rank[i] > rank[j] {
tmp = append(tmp, i)
}
}
sort.Slice(tmp, func(x, y int) bool {
return rank[tmp[x]] < rank[tmp[y]]
})
for _, i := range tmp {
ans = append(ans, Pair{u: i + 1, v: j + 1})
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
out.WriteString(strconv.Itoa(len(ans)))
out.WriteByte('\n')
for _, p := range ans {
out.WriteString(strconv.Itoa(p.u))
out.WriteByte(' ')
out.WriteString(strconv.Itoa(p.v))
out.WriteByte('\n')
}
out.Flush()
}