← Home
For problem statement at 0-999/800-899/870-879/875/problemE.txt this is a correct solution, but verifier at 0-999/800-899/870-879/875/verifierE.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

var buf []byte
var bufIdx, bufLen int

func nextInt() int {
	for bufIdx < bufLen && buf[bufIdx] <= ' ' {
		bufIdx++
	}
	if bufIdx >= bufLen {
		return 0
	}
	res := 0
	sign := 1
	if buf[bufIdx] == '-' {
		sign = -1
		bufIdx++
	}
	for bufIdx < bufLen && buf[bufIdx] >= '0' && buf[bufIdx] <= '9' {
		res = res*10 + int(buf[bufIdx]-'0')
		bufIdx++
	}
	return res * sign
}

func abs(a int) int {
	if a < 0 {
		return -a
	}
	return a
}

func lowerBound(vals []int, target int) int {
	l, r := 0, len(vals)
	for l < r {
		mid := l + (r-l)/2
		if vals[mid] >= target {
			r = mid
		} else {
			l = mid + 1
		}
	}
	return l
}

func upperBound(vals []int, target int) int {
	l, r := 0, len(vals)
	for l < r {
		mid := l + (r-l)/2
		if vals[mid] > target {
			r = mid
		} else {
			l = mid + 1
		}
	}
	return l
}

type Node struct {
	sum   int
	clear bool
}

var tree []Node
var X []int
var vals []int
var n, s1, s2, m int

func initTree(m int) {
	for i := 0; i < 4*m+10; i++ {
		tree[i].sum = 0
		tree[i].clear = false
	}
}

func pushDown(node int) {
	if tree[node].clear {
		tree[2*node].sum = 0
		tree[2*node].clear = true
		tree[2*node+1].sum = 0
		tree[2*node+1].clear = true
		tree[node].clear = false
	}
}

func updateRangeZero(node, l, r, ql, qr int) {
	if ql > r || qr < l {
		return
	}
	if ql <= l && r <= qr {
		tree[node].sum = 0
		tree[node].clear = true
		return
	}
	pushDown(node)
	mid := l + (r-l)/2
	updateRangeZero(2*node, l, mid, ql, qr)
	updateRangeZero(2*node+1, mid+1, r, ql, qr)
	tree[node].sum = tree[2*node].sum + tree[2*node+1].sum
}

func updatePointOne(node, l, r, pos int) {
	if l == r {
		tree[node].sum = 1
		tree[node].clear = false
		return
	}
	pushDown(node)
	mid := l + (r-l)/2
	if pos <= mid {
		updatePointOne(2*node, l, mid, pos)
	} else {
		updatePointOne(2*node+1, mid+1, r, pos)
	}
	tree[node].sum = tree[2*node].sum + tree[2*node+1].sum
}

func check(D int) bool {
	if abs(X[0]-s2) > D {
		return false
	}
	initTree(m)
	posS2 := lowerBound(vals, s2)
	updatePointOne(1, 0, m-1, posS2)

	for i := 1; i <= n; i++ {
		can_add := tree[1].sum > 0 && abs(X[i]-X[i-1]) <= D

		left_idx := lowerBound(vals, X[i]-D)
		right_idx := upperBound(vals, X[i]+D) - 1

		if left_idx > 0 {
			updateRangeZero(1, 0, m-1, 0, left_idx-1)
		}
		if right_idx < m-1 {
			updateRangeZero(1, 0, m-1, right_idx+1, m-1)
		}

		if can_add {
			posPrev := lowerBound(vals, X[i-1])
			updatePointOne(1, 0, m-1, posPrev)
		}

		if tree[1].sum == 0 {
			return false
		}
	}
	return true
}

func main() {
	b, _ := io.ReadAll(os.Stdin)
	buf = b
	bufLen = len(buf)

	n = nextInt()
	s1 = nextInt()
	s2 = nextInt()

	X = make([]int, n+1)
	X[0] = s1
	vals = make([]int, 0, n+2)
	vals = append(vals, s2, s1)

	for i := 1; i <= n; i++ {
		X[i] = nextInt()
		vals = append(vals, X[i])
	}

	sort.Ints(vals)
	m = 0
	for i := 0; i < len(vals); i++ {
		if i == 0 || vals[i] != vals[i-1] {
			vals[m] = vals[i]
			m++
		}
	}
	vals = vals[:m]

	tree = make([]Node, 4*m+10)

	low := abs(s1 - s2)
	high := 1000000000
	ans := high

	for low <= high {
		mid := low + (high-low)/2
		if check(mid) {
			ans = mid
			high = mid - 1
		} else {
			low = mid + 1
		}
	}

	fmt.Println(ans)
}