package main
import (
"fmt"
)
func max(a,b int ) int {
if a >b {
return a
}
return b
}
func main() {
var n int
fmt.Scanf("%d", &n)
var k = make([]int, n)
for i := 0; i < n; i++ {
fmt.Scanf("%d", &k[i])
}
var hasUp bool = true // 是否非减, 默认起始位置都是升坡
var maxH,l,top, r int = 0,0,0,0 // 最大突起度,单个山脉的左边缘、顶部、右边缘
for i := 1;i<n ;i++{
if k[i] >= k[i-1] && hasUp {
continue // 仍在上坡
}
if k[i] > k[i-1] && !hasUp { // 遍历了一个山脉,但没有考虑到最后是下坡的情况
r = i -1
t := max(k[top] - k[l], k[top] - k[r])
if t > maxH {
maxH = t
}
l = i-1
hasUp = true
continue
}
if k[i] < k[i-1] && hasUp {
// i-1是坡顶
top = i -1
hasUp = false
continue
}
if k[i] <= k[i-1] && !hasUp {
continue // 仍在下坡
}
}
// 考虑最后是下坡的情况
if n > 1 {
r = n-1
t := max(k[top] - k[l], k[top] - k[r])
if t > maxH {
maxH = t
}
}
fmt.Println(maxH)
}