← Home
For problem statement at 1000-1999/1800-1899/1880-1889/1887/problemD.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1880-1889/1887/verifierD.go ends with All 200 tests passed can you fix the verifier? package main

import (
	"bufio"
	"os"
)

const INF = 1000000000

var maxTree []int
var fTree []int
var lazy []bool

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
}

func buildMaxTree(node, L, R int, a []int) {
	if L == R {
		maxTree[node] = a[L]
		return
	}
	mid := (L + R) / 2
	buildMaxTree(node*2, L, mid, a)
	buildMaxTree(node*2+1, mid+1, R, a)
	maxTree[node] = max(maxTree[node*2], maxTree[node*2+1])
}

func queryMaxIndex(node, L, R, qL, qR, v int) int {
	if qL > qR || L > qR || R < qL || maxTree[node] <= v {
		return 0
	}
	if L == R {
		return L
	}
	mid := (L + R) / 2
	res := queryMaxIndex(node*2+1, mid+1, R, qL, qR, v)
	if res == 0 {
		res = queryMaxIndex(node*2, L, mid, qL, qR, v)
	}
	return res
}

func buildFTree(node, L, R int) {
	fTree[node] = 0
	lazy[node] = false
	if L == R {
		return
	}
	mid := (L + R) / 2
	buildFTree(node*2, L, mid)
	buildFTree(node*2+1, mid+1, R)
}

func pushDown(node int) {
	if lazy[node] {
		fTree[node*2] = INF
		lazy[node*2] = true
		fTree[node*2+1] = INF
		lazy[node*2+1] = true
		lazy[node] = false
	}
}

func updateRange(node, L, R, qL, qR int) {
	if qL > qR || L > qR || R < qL {
		return
	}
	if qL <= L && R <= qR {
		fTree[node] = INF
		lazy[node] = true
		return
	}
	pushDown(node)
	mid := (L + R) / 2
	updateRange(node*2, L, mid, qL, qR)
	updateRange(node*2+1, mid+1, R, qL, qR)
	fTree[node] = min(fTree[node*2], fTree[node*2+1])
}

func updatePoint(node, L, R, idx, val int) {
	if L == R {
		if fTree[node] < val {
			fTree[node] = val
		}
		return
	}
	pushDown(node)
	mid := (L + R) / 2
	if idx <= mid {
		updatePoint(node*2, L, mid, idx, val)
	} else {
		updatePoint(node*2+1, mid+1, R, idx, val)
	}
	fTree[node] = min(fTree[node*2], fTree[node*2+1])
}

func queryMin(node, L, R, qL, qR int) int {
	if qL > qR || L > qR || R < qL {
		return INF
	}
	if qL <= L && R <= qR {
		return fTree[node]
	}
	pushDown(node)
	mid := (L + R) / 2
	return min(queryMin(node*2, L, mid, qL, qR), queryMin(node*2+1, mid+1, R, qL, qR))
}

func readInt(in *bufio.Reader) int {
	var x int
	var c byte
	var err error
	for {
		c, err = in.ReadByte()
		if err != nil {
			return 0
		}
		if c >= '0' && c <= '9' {
			break
		}
	}
	x = int(c - '0')
	for {
		c, err = in.ReadByte()
		if err != nil {
			break
		}
		if c >= '0' && c <= '9' {
			x = x*10 + int(c-'0')
		} else {
			break
		}
	}
	return x
}

type Query struct {
	l, id int
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	n := readInt(in)
	if n == 0 {
		return
	}

	a := make([]int, n+1)
	for i := 1; i <= n; i++ {
		a[i] = readInt(in)
	}

	q := readInt(in)
	queries := make([][]Query, n+1)
	for i := 0; i < q; i++ {
		l := readInt(in)
		r := readInt(in)
		queries[r] = append(queries[r], Query{l, i})
	}

	maxTree = make([]int, 4*n+1)
	fTree = make([]int, 4*n+1)
	lazy = make([]bool, 4*n+1)

	buildMaxTree(1, 1, n, a)
	buildFTree(1, 1, n)

	ans := make([]bool, q)
	stack := make([]int, 0, n)

	for r := 1; r <= n; r++ {
		for len(stack) > 0 && a[stack[len(stack)-1]] > a[r] {
			stack = stack[:len(stack)-1]
		}
		y := 0
		if len(stack) > 0 {
			y = stack[len(stack)-1]
		}
		stack = append(stack, r)

		if y+1 <= r-1 {
			updateRange(1, 1, n, y+1, r-1)
		}
		if y >= 1 {
			X := queryMaxIndex(1, 1, n, 1, y-1, a[r])
			updatePoint(1, 1, n, y, X+1)
		}

		for _, qry := range queries[r] {
			minF := queryMin(1, 1, n, qry.l, r-1)
			if minF <= qry.l {
				ans[qry.id] = true
			} else {
				ans[qry.id] = false
			}
		}
	}

	for i := 0; i < q; i++ {
		if ans[i] {
			out.WriteString("Yes\n")
		} else {
			out.WriteString("No\n")
		}
	}
}