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)
}