← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

type Item struct {
	val int64
	id  int
}

var (
	items []Item
	ans   []int
	d     []int64
)

func dfs(idx int, w1, w2, w3, w4 int64) bool {
	if idx == len(items) {
		return true
	}
	val := items[idx].val
	origId := items[idx].id

	if w1 >= val {
		ans[origId] = 1
		if dfs(idx+1, w1-val, w2, w3, w4) {
			return true
		}
	}
	if w2 >= val && w2 != w1 {
		ans[origId] = 2
		if dfs(idx+1, w1, w2-val, w3, w4) {
			return true
		}
	}
	if w3 >= val && w3 != w1 && w3 != w2 {
		ans[origId] = 3
		if dfs(idx+1, w1, w2, w3-val, w4) {
			return true
		}
	}
	if w4 >= val && w4 != w1 && w4 != w2 && w4 != w3 {
		ans[origId] = 4
		if dfs(idx+1, w1, w2, w3, w4-val) {
			return true
		}
	}
	return false
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n int
	if _, err := fmt.Fscan(in, &n); err != nil {
		return
	}
	var a, b int64
	fmt.Fscan(in, &a, &b)

	d = make([]int64, n-1)
	ans = make([]int, n-1)
	items = make([]Item, n-1)
	var D int64 = 0
	for i := 0; i < n-1; i++ {
		fmt.Fscan(in, &d[i])
		D += d[i]
		items[i] = Item{val: d[i], id: i}
	}

	U := a + b
	V := a - b

	if (D-U)%2 != 0 {
		fmt.Println("NO")
		return
	}

	Ru := (D - U) / 2
	Rv := (D - V) / 2

	if Ru < 0 || Ru > D || Rv < 0 || Rv > D {
		fmt.Println("NO")
		return
	}

	sort.Slice(items, func(i, j int) bool {
		return items[i].val > items[j].val
	})

	if !dfs(0, Ru, D-Ru, Rv, D-Rv) {
		fmt.Println("NO")
		return
	}

	sumA1 := int64(0)
	sumB1 := int64(0)

	k := make([]int64, len(d))
	j := make([]int64, len(d))

	for i := 0; i < len(d); i++ {
		switch ans[i] {
		case 1:
			k[i] = d[i]
			sumA1 += d[i]
		case 2:
			k[i] = 0
		case 3:
			j[i] = d[i]
			sumB1 += d[i]
		case 4:
			j[i] = 0
		}
	}

	remU := Ru - sumA1
	for i := 0; i < len(d); i++ {
		if ans[i] == 3 || ans[i] == 4 {
			take := d[i]
			if remU < take {
				take = remU
			}
			k[i] = take
			remU -= take
		}
	}

	remV := Rv - sumB1
	for i := 0; i < len(d); i++ {
		if ans[i] == 1 || ans[i] == 2 {
			take := d[i]
			if remV < take {
				take = remV
			}
			j[i] = take
			remV -= take
		}
	}

	fmt.Println("YES")
	x, y := int64(0), int64(0)
	fmt.Println(x, y)
	for i := 0; i < len(d); i++ {
		du := d[i] - 2*k[i]
		dv := d[i] - 2*j[i]

		dx := (du + dv) / 2
		dy := (du - dv) / 2

		x += dx
		y += dy
		fmt.Println(x, y)
	}
}