package main import . "fmt" import . "os" import bf "bufio" func main() { rd := bf.NewReader(Stdin) var n,m int Fscan(rd,&n,&m) h := make([]int, n+1) for i := range h[1:] { Fscan(rd,&h[i+1]) } g := make([][]int, n+1) for i := 0; i < m; i++ { var x, y int Fscan(rd,&x,&y) g[x] = append(g[x], y) g[y] = append(g[y], x) } dp0 := make([]int, n+1) dp1 := make([]int, n+1) for i := range dp0 { dp0[i] = -1 dp1[i] = -1 } dp0[1] = 0 for i := 1; i < n; i++ { if dp0[i] < 0 && dp1[i] < 0 { continue } for _, e := range g[i] { if e < i { continue } if h[i] > h[e] { dp0[e] = max(dp0[e], dp0[i], dp1[i]) } else if dp0[i] >= 0 { dp1[e] = max(dp1[e], dp0[i]+(h[e]-h[i])) } } } Println(max(dp0[n], dp1[n])) dp0 = make([]int, n+1) dp1 = make([]int, n+1) for i := range dp0 { dp0[i] = -1 dp1[i] = -1 } dp0[n] = 0 for i := n; i > 1; i-- { if dp0[i] < 0 && dp1[i] < 0 { continue } for _, e := range g[i] { if e > i { continue } if h[i] > h[e] { dp0[e] = max(dp0[e], dp0[i], dp1[i]) } else if dp0[i] >= 0 { dp1[e] = max(dp1[e], dp0[i]+(h[e]-h[i])) } } } Println(max(dp0[1], dp1[1])) }