← Home
For problem statement at 0-999/400-499/450-459/455/problemE.txt this is a correct solution, but verifier at 0-999/400-499/450-459/455/verifierE.go ends with All 100 tests passed can you fix the verifier? ```go
package main

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

type Line struct {
	m int64
	c int64
}

func (l Line) eval(x int64) int64 {
	return l.m*x + l.c
}

type Node struct {
	line Line
	l, r int
}

var tree []Node

func insert(oldRoot int, l, r int, newLine Line) int {
	newNode := len(tree)
	tree = append(tree, tree[oldRoot])

	mid := (l + r) / 2

	betterLeft := newLine.eval(int64(l)) < tree[newNode].line.eval(int64(l))
	betterMid := newLine.eval(int64(mid)) < tree[newNode].line.eval(int64(mid))

	if betterMid {
		tree[newNode].line, newLine = newLine, tree[newNode].line
	}

	if l == r {
		return newNode
	}

	if betterLeft != betterMid {
		tree[newNode].l = insert(tree[newNode].l, l, mid, newLine)
	} else {
		tree[newNode].r = insert(tree[newNode].r, mid+1, r, newLine)
	}

	return newNode
}

func query(root int, l, r int, x int) int64 {
	if root == 0 {
		return 1000000000000000000
	}
	res := tree[root].line.eval(int64(x))
	if l == r {
		return res
	}
	mid := (l + r) / 2
	if x <= mid {
		val := query(tree[root].l, l, mid, x)
		if val < res {
			res = val
		}
	} else {
		val := query(tree[root].r, mid+1, r, x)
		if val < res {
			res = val
		}
	}
	return res
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
	scanner.Split(bufio.ScanWords)

	readInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}

	res := 0
	for _, b := range scanner.Bytes() {
		res = res*10 + int(b-'0')
	}
	n := res

	a := make([]int64, n+1)
	pref := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		a[i] = int64(readInt())
		pref[i] = pref[i-1] + a[i]
	}

	tree = make([]Node, 1, 3000000)
	tree[0] = Node{line: Line{m: 0, c: 1000000000000000000}, l: 0, r: 0}

	version := make([]int, n+1)
	version[0] = 0

	st := make([]int, 0, n)

	for j := 1; j <= n; j++ {
		for len(st) > 0 && a[st[len(st)-1]] >= a[j] {
			st = st[:len(st)-1]
		}

		k := 0
		if len(st) > 0 {
			k = st[len(st)-1]
		}

		m := -a[j]
		c := int64(j)*a[j] - pref[j-1]

		version[j] = insert(version[k], 1, n, Line{m: m, c: c})
		st = append(st, j)
	}

	m_queries := readInt()

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for q := 0; q < m_queries; q++ {
		xi := readInt()
		yi := readInt()
		L := yi - xi + 1

		ans := pref[yi] + query(version[yi], 1, n, L)
		fmt.Fprintln(out, ans)
	}
}
```