```go
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
var n int
fmt.Scan(&n)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&a[i])
}
if a[n-1] == 1 {
fmt.Println("NO")
return
}
if n >= 2 && a[n-1] == 0 && a[n-2] == 0 {
allOnes := true
for i := 0; i < n-2; i++ {
if a[i] != 1 {
allOnes = false
break
}
}
if allOnes {
fmt.Println("NO")
return
}
}
fmt.Println("YES")
if n == 1 {
fmt.Println("0")
return
}
prefix := buildPrefix(a[:n-1])
fmt.Printf("(%s)->%d\n", prefix, a[n-1])
}
func buildPrefix(a []int) string {
m := len(a)
if m == 0 {
return ""
}
var sb strings.Builder
if a[m-1] == 1 {
for i := 0; i < m; i++ {
if i > 0 {
sb.WriteString("->")
}
sb.WriteString(strconv.Itoa(a[i]))
}
return sb.String()
} else {
if a[0] == 0 {
for i := 0; i < m; i++ {
if i > 0 {
sb.WriteString("->")
}
sb.WriteString(strconv.Itoa(a[i]))
}
return sb.String()
} else {
p := 0
for p < m && a[p] == 1 {
p++
}
sb.WriteString("(")
for i := 0; i < p; i++ {
if i > 0 {
sb.WriteString("->")
}
sb.WriteString(strconv.Itoa(a[i]))
}
sb.WriteString(")->")
for i := p; i < m; i++ {
if i > p {
sb.WriteString("->")
}
sb.WriteString(strconv.Itoa(a[i]))
}
return sb.String()
}
}
}
```