← Home
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()
}