← 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? package main

import (
	"io"
	"os"
	"sort"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt64() int64 {
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c != ' ' && c != '\n' && c != '\r' && c != '\t' {
			break
		}
		fs.idx++
	}
	sign := int64(1)
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	var v int64
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		v = v*10 + int64(c-'0')
		fs.idx++
	}
	return v * sign
}

type Edge struct {
	l   int
	r   int
	val int64
}

type Query struct {
	l   int
	r   int
	idx int
}

type BIT struct {
	n    int
	inf  int64
	tree []int64
}

func NewBIT(n int, inf int64) *BIT {
	tree := make([]int64, n+2)
	for i := range tree {
		tree[i] = inf
	}
	return &BIT{n: n, inf: inf, tree: tree}
}

func (b *BIT) Update(i int, v int64) {
	for i <= b.n {
		if v < b.tree[i] {
			b.tree[i] = v
		}
		i += i & -i
	}
}

func (b *BIT) Query(i int) int64 {
	res := b.inf
	for i > 0 {
		if b.tree[i] < res {
			res = b.tree[i]
		}
		i -= i & -i
	}
	return res
}

func main() {
	fs := NewFastScanner()
	n := int(fs.NextInt64())
	q := int(fs.NextInt64())

	x := make([]int64, n+1)
	w := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		x[i] = fs.NextInt64()
		w[i] = fs.NextInt64()
	}

	prev := make([]int, n+1)
	next := make([]int, n+1)

	stack := make([]int, 0, n)
	for i := 1; i <= n; i++ {
		for len(stack) > 0 && w[stack[len(stack)-1]] > w[i] {
			stack = stack[:len(stack)-1]
		}
		if len(stack) > 0 {
			prev[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	stack = stack[:0]
	for i := n; i >= 1; i-- {
		for len(stack) > 0 && w[stack[len(stack)-1]] > w[i] {
			stack = stack[:len(stack)-1]
		}
		if len(stack) > 0 {
			next[i] = stack[len(stack)-1]
		}
		stack = append(stack, i)
	}

	edges := make([]Edge, 0, 2*n)
	for i := 1; i <= n; i++ {
		if prev[i] != 0 {
			l := prev[i]
			val := (x[i] - x[l]) * (w[i] + w[l])
			edges = append(edges, Edge{l: l, r: i, val: val})
		}
		if next[i] != 0 {
			r := next[i]
			val := (x[r] - x[i]) * (w[r] + w[i])
			edges = append(edges, Edge{l: i, r: r, val: val})
		}
	}

	queries := make([]Query, q)
	for i := 0; i < q; i++ {
		l := int(fs.NextInt64())
		r := int(fs.NextInt64())
		queries[i] = Query{l: l, r: r, idx: i}
	}

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

	const inf int64 = 1 << 62
	bit := NewBIT(n, inf)
	ans := make([]int64, q)

	p := 0
	for _, qu := range queries {
		for p < len(edges) && edges[p].r <= qu.r {
			bit.Update(n-edges[p].l+1, edges[p].val)
			p++
		}
		ans[qu.idx] = bit.Query(n - qu.l + 1)
	}

	out := make([]byte, 0, q*20)
	for i := 0; i < q; i++ {
		out = strconv.AppendInt(out, ans[i], 10)
		out = append(out, '\n')
	}
	os.Stdout.Write(out)
}