← Home
For problem statement at 1000-1999/1900-1999/1990-1999/1991/problemF.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1990-1999/1991/verifierF.go ends with All tests passed can you fix the verifier? ```go
package main

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

const K = 50

type Node struct {
	val [K]int64
	sz  int
}

var (
	n, q int
	a    []int64
	tree []Node
)

func merge(left, right Node) Node {
	var res Node
	i, j := 0, 0
	for res.sz < K && i < left.sz && j < right.sz {
		if left.val[i] < right.val[j] {
			res.val[res.sz] = left.val[i]
			i++
		} else {
			res.val[res.sz] = right.val[j]
			j++
		}
		res.sz++
	}
	for res.sz < K && i < left.sz {
		res.val[res.sz] = left.val[i]
		i++
		res.sz++
	}
	for res.sz < K && j < right.sz {
		res.val[res.sz] = right.val[j]
		j++
		res.sz++
	}
	return res
}

func build(node, l, r int) {
	if l == r {
		tree[node].val[0] = a[l]
		tree[node].sz = 1
		return
	}
	mid := (l + r) >> 1
	build(node<<1, l, mid)
	build(node<<1|1, mid+1, r)
	tree[node] = merge(tree[node<<1], tree[node<<1|1])
}

func query(node, l, r, ql, qr int) Node {
	if ql <= l && r <= qr {
		return tree[node]
	}
	mid := (l + r) >> 1
	if qr <= mid {
		return query(node<<1, l, mid, ql, qr)
	}
	if ql > mid {
		return query(node<<1|1, mid+1, r, ql, qr)
	}
	left := query(node<<1, l, mid, ql, qr)
	right := query(node<<1|1, mid+1, r, ql, qr)
	return merge(left, right)
}

func isTri(a, b, c int64) bool {
	return a+b > c
}

func canFormTwo(b [K]int64, idx []int) bool {
	v := [6]int64{}
	for i := 0; i < 6; i++ {
		v[i] = b[idx[i]]
	}
	if isTri(v[0], v[1], v[2]) && isTri(v[3], v[4], v[5]) {
		return true
	}
	if isTri(v[0], v[1], v[3]) && isTri(v[2], v[4], v[5]) {
		return true
	}
	if isTri(v[0], v[1], v[4]) && isTri(v[2], v[3], v[5]) {
		return true
	}
	if isTri(v[0], v[1], v[5]) && isTri(v[2], v[3], v[4]) {
		return true
	}
	if isTri(v[0], v[2], v[3]) && isTri(v[1], v[4], v[5]) {
		return true
	}
	if isTri(v[0], v[2], v[4]) && isTri(v[1], v[3], v[5]) {
		return true
	}
	if isTri(v[0], v[2], v[5]) && isTri(v[1], v[3], v[4]) {
		return true
	}
	if isTri(v[0], v[3], v[4]) && isTri(v[1], v[2], v[5]) {
		return true
	}
	if isTri(v[0], v[3], v[5]) && isTri(v[1], v[2], v[4]) {
		return true
	}
	if isTri(v[0], v[4], v[5]) && isTri(v[1], v[2], v[3]) {
		return true
	}
	return false
}

func check(node Node) bool {
	k := node.sz
	if k < 6 {
		return false
	}
	if k <= 12 {
		idx := make([]int, 6)
		var dfs func(pos, start int) bool
		dfs = func(pos, start int) bool {
			if pos == 6 {
				return canFormTwo(node.val, idx)
			}
			for i := start; i < k; i++ {
				idx[pos] = i
				if dfs(pos+1, i+1) {
					return true
				}
			}
			return false
		}
		return dfs(0, 0)
	}
	good := make([]bool, k)
	for i := 0; i <= k-3; i++ {
		if node.val[i]+node.val[i+1] > node.val[i+2] {
			good[i] = true
		}
	}
	for i := 0; i <= k-3; i++ {
		if good[i] {
			for j := i + 3; j <= k-3; j++ {
				if good[j] {
					return true
				}
			}
		}
	}
	return false
}

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

	fmt.Fscan(reader, &n, &q)
	a = make([]int64, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	tree = make([]Node, 4*n)
	build(1, 0, n-1)

	for i := 0; i < q; i++ {
		var l, r int
		fmt.Fscan(reader, &l, &r)
		l--
		r--
		node := query(1, 0, n-1, l, r)
		if check(node) {
			fmt.Fprintln(writer, "YES")
		} else {
			fmt.Fprintln(writer, "NO")
		}
	}
}
```