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

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

const INF = 4000000000000000000

type Pair struct {
	u, v int
	w    int64
}

type Query struct {
	l, r, id int
}

var (
	n, q   int
	x      []int
	w      []int
	st     [][]int
	logs   []int
	pairs  []Pair
	tree   []int64
	sz     int
)

func minIdx(i, j int) int {
	if w[i] < w[j] {
		return i
	}
	if w[j] < w[i] {
		return j
	}
	return i
}

func queryMinIdx(L, R int) int {
	j := logs[R-L+1]
	return minIdx(st[j][L], st[j][R-(1<<j)+1])
}

func buildST() {
	logs = make([]int, n+1)
	logs[1] = 0
	for i := 2; i <= n; i++ {
		logs[i] = logs[i/2] + 1
	}
	K := logs[n] + 1
	st = make([][]int, K)
	for i := range st {
		st[i] = make([]int, n)
	}
	for i := 0; i < n; i++ {
		st[0][i] = i
	}
	for j := 1; j < K; j++ {
		length := 1 << (j - 1)
		for i := 0; i+2*length <= n; i++ {
			st[j][i] = minIdx(st[j-1][i], st[j-1][i+length])
		}
	}
}

func solveRecursive(l, r int) {
	if l >= r {
		return
	}
	m := queryMinIdx(l, r)

	xm := int64(x[m])
	wm := int64(w[m])

	mw := int64(INF)
	for i := m - 1; i >= l; i-- {
		wi := int64(w[i])
		if wi < mw {
			pairs = append(pairs, Pair{i, m, (xm - int64(x[i])) * (wm + wi)})
			mw = wi
		}
	}

	mw = int64(INF)
	for i := m + 1; i <= r; i++ {
		wi := int64(w[i])
		if wi < mw {
			pairs = append(pairs, Pair{m, i, (int64(x[i]) - xm) * (wm + wi)})
			mw = wi
		}
	}

	solveRecursive(l, m-1)
	solveRecursive(m+1, r)
}

func update(p int, value int64) {
	p += sz
	if value < tree[p] {
		tree[p] = value
		for p > 1 {
			tree[p>>1] = min64(tree[p], tree[p^1])
			p >>= 1
		}
	}
}

func query(l, r int) int64 {
	res := int64(INF)
	for l, r = l+sz, r+sz; l < r; l, r = l>>1, r>>1 {
		if l&1 == 1 {
			res = min64(res, tree[l])
			l++
		}
		if r&1 == 1 {
			r--
			res = min64(res, tree[r])
		}
	}
	return res
}

func min64(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

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

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

	buildST()
	pairs = make([]Pair, 0, n*20)
	solveRecursive(0, n-1)

	queries := make([]Query, q)
	for i := 0; i < q; i++ {
		var l, r int
		fmt.Fscan(reader, &l, &r)
		queries[i] = Query{l - 1, r - 1, i}
	}

	sort.Slice(queries, func(i, j int) bool {
		return queries[i].r < queries[j].r
	})

	sort.Slice(pairs, func(i, j int) bool {
		return pairs[i].v < pairs[j].v
	})

	ans := make([]int64, q)

	sz = 1
	for sz < n {
		sz *= 2
	}
	tree = make([]int64, 2*sz)
	for i := range tree {
		tree[i] = INF
	}

	pIdx := 0
	for _, qry := range queries {
		for pIdx < len(pairs) && pairs[pIdx].v <= qry.r {
			update(pairs[pIdx].u, pairs[pIdx].w)
			pIdx++
		}
		ans[qry.id] = query(qry.l, qry.r+1)
	}

	for _, v := range ans {
		fmt.Fprintln(writer, v)
	}
}
```