← Home
For problem statement at 1000-1999/1800-1899/1860-1869/1864/problemF.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1860-1869/1864/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"io"
	"os"
)

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

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c >= '0' && c <= '9' {
			break
		}
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int(c-'0')
		fs.idx++
	}
	return val
}

type SegTree struct {
	size int
	t    []int
}

func NewSegTree(n int) *SegTree {
	size := 1
	for size < n {
		size <<= 1
	}
	return &SegTree{size: size, t: make([]int, size<<1)}
}

func (s *SegTree) Update(pos, val int) {
	p := pos + s.size - 1
	s.t[p] = val
	for p >>= 1; p > 0 && s.t[p] < val; p >>= 1 {
		s.t[p] = val
	}
}

func (s *SegTree) Query(l, r int) int {
	if l > r {
		return 0
	}
	l += s.size - 1
	r += s.size - 1
	res := 0
	for l <= r {
		if (l & 1) == 1 {
			if s.t[l] > res {
				res = s.t[l]
			}
			l++
		}
		if (r & 1) == 0 {
			if s.t[r] > res {
				res = s.t[r]
			}
			r--
		}
		l >>= 1
		r >>= 1
	}
	return res
}

func bitAdd(bit []int, idx, val int) {
	for idx < len(bit) {
		bit[idx] += val
		idx += idx & -idx
	}
}

func bitSum(bit []int, idx int) int {
	res := 0
	for idx > 0 {
		res += bit[idx]
		idx -= idx & -idx
	}
	return res
}

func appendInt(buf []byte, x int) []byte {
	if x == 0 {
		return append(buf, '0')
	}
	var tmp [20]byte
	i := len(tmp)
	for x > 0 {
		i--
		tmp[i] = byte('0' + x%10)
		x /= 10
	}
	return append(buf, tmp[i:]...)
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data, n: len(data)}

	n := fs.NextInt()
	q := fs.NextInt()

	a := make([]int, n+1)
	cnt := make([]int, n+2)

	for i := 1; i <= n; i++ {
		v := fs.NextInt()
		a[i] = v
		cnt[v]++
	}

	sum := 0
	for v := 1; v <= n+1; v++ {
		c := cnt[v]
		cnt[v] = sum
		sum += c
	}

	cur := make([]int, n+1)
	copy(cur, cnt[:n+1])

	posAll := make([]int, n)
	for i := 1; i <= n; i++ {
		v := a[i]
		posAll[cur[v]] = i
		cur[v]++
	}

	headP := make([]int, n+1)
	for i := 0; i <= n; i++ {
		headP[i] = -1
	}
	pairX := make([]int, n)
	pairNext := make([]int, n)
	pairCnt := 0

	seg := NewSegTree(n)
	for x := 1; x <= n; x++ {
		st := cnt[x]
		ed := cnt[x+1]
		if ed-st >= 2 {
			prev := posAll[st]
			for i := st + 1; i < ed; i++ {
				curr := posAll[i]
				if prev+1 <= curr-1 {
					b := seg.Query(prev+1, curr-1)
					if b > 0 {
						pairX[pairCnt] = x
						pairNext[pairCnt] = headP[b]
						headP[b] = pairCnt
						pairCnt++
					}
				}
				prev = curr
			}
		}
		for i := st; i < ed; i++ {
			seg.Update(posAll[i], x)
		}
	}

	prevStart := cnt[1]
	distinct := 0
	for x := 1; x <= n; x++ {
		nextStart := cnt[x+1]
		if nextStart > prevStart {
			distinct++
		}
		cnt[x] = distinct
		prevStart = nextStart
	}

	headQ := make([]int, n+1)
	for i := 0; i <= n; i++ {
		headQ[i] = -1
	}
	qR := make([]int, q)
	qNext := make([]int, q)
	ans := make([]int, q)

	for i := 0; i < q; i++ {
		l := fs.NextInt()
		r := fs.NextInt()
		qR[i] = r
		qNext[i] = headQ[l]
		headQ[l] = i
		ans[i] = cnt[r] - cnt[l-1]
	}

	bit := make([]int, n+2)

	for l := n; l >= 1; l-- {
		for idx := headP[l]; idx != -1; idx = pairNext[idx] {
			bitAdd(bit, pairX[idx], 1)
		}
		for id := headQ[l]; id != -1; id = qNext[id] {
			ans[id] += bitSum(bit, qR[id]) - bitSum(bit, l-1)
		}
	}

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