package main

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

func main() {
	for {
		scanner := bufio.NewScanner(os.Stdin)

		// 设置大缓冲区,防止大输入时出错
		buf := make([]byte, 1024*1024) // 1MB
		scanner.Buffer(buf, 1024*1024)
		scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔)

		// 读取第一行:n
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}

		arr := make([]int, n)
		for i := 0; i < n; i++ {
			scanner.Scan()
			arr[i], _ = strconv.Atoi(scanner.Text())
		}
		fmt.Println(process(arr))
	}
}

type Bucket struct {
	minnu  int
	maxnu  int
	isused bool
}

func process(arr []int) int {
	if len(arr) < 2 {
		return 0
	}

	minnu, maxnu := arr[0], arr[0]
	for i := 1; i < len(arr); i++ {
		minnu = min(minnu, arr[i])
		maxnu = max(maxnu, arr[i])
	}

	// 保证interfal不为0
	interfal := (maxnu-minnu)/(len(arr)+1) + 1
	// 至少有一个空桶,
	bucket := make([]Bucket, len(arr)+1)

	for _, v := range arr {
		index := (v - minnu) / interfal
		if !bucket[index].isused {
			bucket[index].isused = true
			bucket[index].minnu = v
			bucket[index].maxnu = v
		} else {
			bucket[index].minnu = min(bucket[index].minnu, v)
			bucket[index].maxnu = max(bucket[index].maxnu, v)
		}
	}

	first := true
	premax := 0
	maxres := 0
	for _, v := range bucket {
		if v.isused && first {
			premax = v.maxnu
			first = false
		} else if v.isused {
			maxres = max(v.minnu-premax, maxres)
			premax = v.maxnu
		}
	}
	return maxres
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}