← Home
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < len(fs.data) && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') && fs.data[fs.idx] != '-' {
		fs.idx++
	}
	sign := 1
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < len(fs.data) && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return sign * val
}

type Pair struct {
	l, r int
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()
	a := make([]int, n)
	for i := 0; i < n; i++ {
		a[i] = fs.NextInt()
	}

	stack := make([]int, 0)
	ans := make([]Pair, 0)
	prev := 0

	for i := 1; i <= n; i++ {
		cur := a[i-1]
		if cur > prev {
			for j := 0; j < cur-prev; j++ {
				stack = append(stack, i)
			}
		} else if cur < prev {
			for j := 0; j < prev-cur; j++ {
				s := stack[len(stack)-1]
				stack = stack[:len(stack)-1]
				ans = append(ans, Pair{s, i - 1})
			}
		}
		prev = cur
	}

	for len(stack) > 0 {
		s := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		ans = append(ans, Pair{s, n})
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprintln(out, len(ans))
	for _, p := range ans {
		fmt.Fprintln(out, p.l, p.r)
	}
	out.Flush()
}