← Home
package main

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

type Node struct {
	w   int64
	gid int
}

type Op struct {
	x  int
	dir byte
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n int
	if _, err := fmt.Fscan(in, &n); err != nil {
		return
	}
	a := make([]int64, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &a[i])
	}
	var k int
	fmt.Fscan(in, &k)
	b := make([]int64, k)
	for i := 0; i < k; i++ {
		fmt.Fscan(in, &b[i])
	}

	segEnds := make([]int, 0, k)
	sum := int64(0)
	j := 0
	start := 0
	for i := 0; i < n; i++ {
		if j >= k {
			fmt.Fprintln(out, "NO")
			return
		}
		sum += a[i]
		if sum == b[j] {
			segEnds = append(segEnds, i)
			j++
			sum = 0
			start = i + 1
		} else if sum > b[j] {
			fmt.Fprintln(out, "NO")
			return
		}
	}
	if j != k || start != n {
		fmt.Fprintln(out, "NO")
		return
	}

	cur := make([]Node, 0, n)
	segIdx := 0
	end := segEnds[segIdx]
	for i := 0; i < n; i++ {
		cur = append(cur, Node{w: a[i], gid: segIdx + 1})
		if i == end && segIdx+1 < k {
			segIdx++
			end = segEnds[segIdx]
		}
	}

	ops := make([]Op, 0, n-k)

	findBlock := func(g int) (int, int, int) {
		L, R := -1, -1
		cnt := 0
		for i := 0; i < len(cur); i++ {
			if cur[i].gid == g {
				if cnt == 0 {
					L = i
				}
				R = i
				cnt++
			}
		}
		return L, R, cnt
	}

	for g := 1; g <= k; g++ {
		L, R, cnt := findBlock(g)
		if cnt == 0 {
			fmt.Fprintln(out, "NO")
			return
		}
		if cnt == 1 {
			continue
		}
		maxw := cur[L].w
		for i := L; i <= R; i++ {
			if cur[i].w > maxw {
				maxw = cur[i].w
			}
		}
		p := -1
		for i := L; i <= R; i++ {
			if cur[i].w == maxw {
				leftOk := (i-1 >= L && cur[i-1].w < cur[i].w)
				rightOk := (i+1 <= R && cur[i+1].w < cur[i].w)
				if leftOk || rightOk {
					p = i
					break
				}
			}
		}
		if p == -1 {
			fmt.Fprintln(out, "NO")
			return
		}

		L, R, _ = findBlock(g)
		leftPossible := (p-1 >= L && cur[p-1].gid == g && cur[p-1].w < cur[p].w)
		rightPossible := (p+1 <= R && cur[p+1].gid == g && cur[p+1].w < cur[p].w)

		if leftPossible {
			for p-1 >= 0 && cur[p-1].gid == g && cur[p-1].w < cur[p].w {
				ops = append(ops, Op{x: p + 1, dir: 'L'})
				cur[p].w += cur[p-1].w
				cur = append(cur[:p-1], cur[p:]...)
				p = p - 1
			}
			for p+1 < len(cur) && cur[p+1].gid == g {
				if !(cur[p+1].w < cur[p].w) {
					fmt.Fprintln(out, "NO")
					return
				}
				ops = append(ops, Op{x: p + 1, dir: 'R'})
				cur[p].w += cur[p+1].w
				cur = append(cur[:p+1], cur[p+2:]...)
			}
		} else if rightPossible {
			for p+1 < len(cur) && cur[p+1].gid == g && cur[p+1].w < cur[p].w {
				ops = append(ops, Op{x: p + 1, dir: 'R'})
				cur[p].w += cur[p+1].w
				cur = append(cur[:p+1], cur[p+2:]...)
			}
			for p-1 >= 0 && cur[p-1].gid == g {
				if !(cur[p-1].w < cur[p].w) {
					fmt.Fprintln(out, "NO")
					return
				}
				ops = append(ops, Op{x: p + 1, dir: 'L'})
				cur[p].w += cur[p-1].w
				cur = append(cur[:p-1], cur[p:]...)
				p = p - 1
			}
		} else {
			fmt.Fprintln(out, "NO")
			return
		}
	}

	if len(cur) != k {
		fmt.Fprintln(out, "NO")
		return
	}
	for i := 0; i < k; i++ {
		if cur[i].w != b[i] {
			fmt.Fprintln(out, "NO")
			return
		}
	}

	fmt.Fprintln(out, "YES")
	for _, op := range ops {
		fmt.Fprintf(out, "%d %c\n", op.x, op.dir)
	}
}