← Home
For problem statement at 2000-2999/2000-2099/2060-2069/2063/problemF2.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2060-2069/2063/verifierF2.go ends with reference failed: exit status 2
panic: runtime error: index out of range [600006] with length 600005

goroutine 1 [running]:
main.initComb()
	/home/ubuntu/codeforces/2000-2999/2000-2099/2060-2069/2063/2063F2.go:45 +0x2a4
main.main()
	/home/ubuntu/codeforces/2000-2999/2000-2099/2060-2069/2063/2063F2.go:180 +0x70
exit status 1 can you fix the verifier? package main

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

const MOD = 998244353
const MAX = 600005

var fact [MAX]int64
var inv_fact [MAX]int64

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func modInverse(n int64) int64 {
	return power(n, MOD-2)
}

func precompute() {
	fact[0] = 1
	inv_fact[0] = 1
	for i := 1; i < MAX; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	inv_fact[MAX-1] = modInverse(fact[MAX-1])
	for i := MAX - 2; i >= 1; i-- {
		inv_fact[i] = (inv_fact[i+1] * int64(i+1)) % MOD
	}
}

func C(k int) int64 {
	if k < 0 {
		return 0
	}
	res := fact[2*k]
	res = (res * inv_fact[k]) % MOD
	res = (res * inv_fact[k+1]) % MOD
	return res
}

func invC(k int) int64 {
	if k < 0 {
		return 0
	}
	res := fact[k]
	res = (res * fact[k+1]) % MOD
	res = (res * inv_fact[2*k]) % MOD
	return res
}

type Interval struct {
	id int
	l  int
	r  int
}

func readInt(reader *bufio.Reader) int {
	b, err := reader.ReadByte()
	for err == nil && (b == ' ' || b == '\n' || b == '\r' || b == '\t') {
		b, err = reader.ReadByte()
	}
	res := 0
	for err == nil && b >= '0' && b <= '9' {
		res = res*10 + int(b-'0')
		b, err = reader.ReadByte()
	}
	return res
}

func main() {
	precompute()

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

	b, _ := reader.Peek(1)
	if len(b) == 0 {
		return
	}

	t := readInt(reader)

	for tc := 0; tc < t; tc++ {
		n := readInt(reader)

		arr := make([]Interval, n+1)
		arr[0] = Interval{0, 0, 2*n + 1}
		for i := 1; i <= n; i++ {
			l := readInt(reader)
			r := readInt(reader)
			arr[i] = Interval{i, l, r}
		}

		sort.Slice(arr, func(i, j int) bool {
			if arr[i].l != arr[j].l {
				return arr[i].l < arr[j].l
			}
			return arr[i].r > arr[j].r
		})

		R_val := make([]int, n+1)
		for i := 0; i <= n; i++ {
			R_val[arr[i].id] = arr[i].r
		}

		parent := make([]int, n+1)
		st := make([]int, 0, n+1)
		st = append(st, arr[0].id)

		for i := 1; i <= n; i++ {
			for len(st) > 0 && R_val[st[len(st)-1]] < arr[i].r {
				st = st[:len(st)-1]
			}
			parent[arr[i].id] = st[len(st)-1]
			st = append(st, arr[i].id)
		}

		m := make([]int, n+1)
		for i := 0; i <= n; i++ {
			length := arr[i].r - arr[i].l + 1
			m[arr[i].id] = (length - 2) / 2
		}

		for i := 1; i <= n; i++ {
			u := arr[i].id
			p := parent[u]
			length := arr[i].r - arr[i].l + 1
			m[p] -= length / 2
		}

		ways := int64(1)
		for i := 0; i <= n; i++ {
			ways = (ways * C(m[i])) % MOD
		}

		ans := make([]int64, n+1)
		ans[n] = ways

		dsu_parent := make([]int, n+1)
		for i := 0; i <= n; i++ {
			dsu_parent[i] = i
		}

		find_set := func(v int) int {
			root := v
			for root != dsu_parent[root] {
				root = dsu_parent[root]
			}
			curr := v
			for curr != root {
				nxt := dsu_parent[curr]
				dsu_parent[curr] = root
				curr = nxt
			}
			return root
		}

		for i := n; i >= 1; i-- {
			u := i
			p := find_set(parent[u])

			ways = (ways * invC(m[p])) % MOD
			ways = (ways * invC(m[u])) % MOD

			m[p] += m[u] + 1

			ways = (ways * C(m[p])) % MOD

			dsu_parent[u] = p

			ans[i-1] = ways
		}

		for i := 0; i <= n; i++ {
			if i > 0 {
				fmt.Fprint(writer, " ")
			}
			fmt.Fprint(writer, ans[i])
		}
		fmt.Fprintln(writer)
	}
}