← Home
 package main

import (
	"fmt"
	"math"
)

var ops [][2]int
var a []int

func mexSegment(l, r int) int {
	seen := make(map[int]bool)
	for i := l; i <= r; i++ {
		seen[a[i]] = true
	}
	m := 0
	for seen[m] {
		m++
	}
	return m
}

func makeUniform(l, r, val int) {
	if l == r {
		if val == 0 {
			if a[l] != 0 {
				ops = append(ops, [2]int{l + 1, r + 1})
				a[l] = 0
			}
		} else {
			if a[l] != 1 {
				if a[l] == 0 {
					ops = append(ops, [2]int{l + 1, r + 1})
					a[l] = 1
				} else {
					ops = append(ops, [2]int{l + 1, r + 1})
					a[l] = 0
					ops = append(ops, [2]int{l + 1, r + 1})
					a[l] = 1
				}
			}
		}
		return
	}
	if val == 0 {
		for i := l; i <= r; i++ {
			makeUniform(i, i, 1)
		}
	} else {
		build(l, r, val)
	}
	ops = append(ops, [2]int{l + 1, r + 1})
	x := mexSegment(l, r)
	for i := l; i <= r; i++ {
		a[i] = x
	}
}

func build(l, r, m int) {
	if m == 0 {
		return
	}
	if m == 1 {
		makeUniform(l, l, 0)
		return
	}
	lenPrev := 1 + (m-2)*(m-1)/2
	build(l, l+lenPrev-1, m-1)
	makeUniform(l+lenPrev, r, m-1)
}

func solve(l, r int, choice [][]int, f []int) {
	if l > r {
		return
	}
	if choice[l][r] == 0 {
		m := f[r-l+1]
		build(l, r, m)
		ops = append(ops, [2]int{l + 1, r + 1})
		x := mexSegment(l, r)
		for i := l; i <= r; i++ {
			a[i] = x
		}
	} else {
		k := choice[l][r] - 1
		solve(l, k, choice, f)
		solve(k+1, r, choice, f)
	}
}

func main() {
	var n int
	fmt.Scan(&n)
	a = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&a[i])
	}

	f := make([]int, n+1)
	for k := 1; k <= n; k++ {
		f[k] = int((1 + math.Sqrt(float64(8*k-7))) / 2)
	}

	dp := make([][]int, n)
	choice := make([][]int, n)
	for i := 0; i < n; i++ {
		dp[i] = make([]int, n)
		choice[i] = make([]int, n)
		if a[i] > 1 {
			dp[i][i] = a[i]
		} else {
			dp[i][i] = 1
		}
		choice[i][i] = 0
	}

	for length := 2; length <= n; length++ {
		for l := 0; l+length-1 < n; l++ {
			r := l + length - 1
			best := length * f[length]
			bestChoice := 0
			for k := l; k < r; k++ {
				val := dp[l][k] + dp[k+1][r]
				if val > best {
					best = val
					bestChoice = k + 1
				}
			}
			dp[l][r] = best
			choice[l][r] = bestChoice
		}
	}

	solve(0, n-1, choice, f)

	fmt.Printf("%d %d\n", dp[0][n-1], len(ops))
	for _, op := range ops {
		fmt.Printf("%d %d\n", op[0], op[1])
	}
}