← Home
For problem statement at 0-999/800-899/890-899/896/problemC.txt this is a correct solution, but verifier at 0-999/800-899/890-899/896/verifierC.go ends with Test 2 failed
Input:
4 8 725576 54
Expected:
33
0
48
42
Got:
33
0
48
0


exit status 1 can you fix the verifier? package main

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

var seed int64

func rnd() int64 {
	ret := seed
	seed = (seed*7 + 13) % 1000000007
	return ret
}

type node struct {
	l, r int
	v    int64
}

var tree []node

func split(pos int) int {
	idx := sort.Search(len(tree), func(i int) bool {
		return tree[i].r >= pos
	})
	if idx == len(tree) {
		return len(tree)
	}
	if tree[idx].l == pos {
		return idx
	}
	tree = append(tree, node{})
	copy(tree[idx+2:], tree[idx+1:])
	tree[idx+1] = node{pos, tree[idx].r, tree[idx].v}
	tree[idx].r = pos - 1
	return idx + 1
}

func assign(l, r int, v int64) {
	ir := split(r + 1)
	il := split(l)
	tree[il] = node{l, r, v}
	tree = append(tree[:il+1], tree[ir:]...)
}

func add(l, r int, v int64) {
	ir := split(r + 1)
	il := split(l)
	for i := il; i < ir; i++ {
		tree[i].v += v
	}
}

type pair struct {
	v     int64
	count int
}

func kth(l, r int, k int) int64 {
	ir := split(r + 1)
	il := split(l)
	arr := make([]pair, 0, ir-il)
	for i := il; i < ir; i++ {
		arr = append(arr, pair{tree[i].v, tree[i].r - tree[i].l + 1})
	}
	sort.Slice(arr, func(i, j int) bool {
		return arr[i].v < arr[j].v
	})
	for _, p := range arr {
		k -= p.count
		if k <= 0 {
			return p.v
		}
	}
	return -1
}

func power(base, exp, mod 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 sumPow(l, r int, x, y int64) int64 {
	ir := split(r + 1)
	il := split(l)
	var ans int64
	for i := il; i < ir; i++ {
		count := int64(tree[i].r - tree[i].l + 1)
		val := power(tree[i].v%y, x, y)
		ans = (ans + val*(count%y)) % y
	}
	return ans
}

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

	var n, m int
	var vmax int64
	fmt.Fscan(in, &n, &m, &seed, &vmax)

	tree = make([]node, n)
	for i := 1; i <= n; i++ {
		tree[i-1] = node{i, i, (rnd() % vmax) + 1}
	}

	for i := 1; i <= m; i++ {
		op := int((rnd() % 4) + 1)
		l := int((rnd() % int64(n)) + 1)
		r := int((rnd() % int64(n)) + 1)
		if l > r {
			l, r = r, l
		}
		var x, y int64
		if op == 3 {
			x = (rnd() % int64(r-l+1)) + 1
		} else {
			x = (rnd() % vmax) + 1
		}
		if op == 4 {
			y = (rnd() % vmax) + 1
		}

		if op == 1 {
			add(l, r, x)
		} else if op == 2 {
			assign(l, r, x)
		} else if op == 3 {
			fmt.Fprintln(out, kth(l, r, int(x)))
		} else if op == 4 {
			fmt.Fprintln(out, sumPow(l, r, x, y))
		}
	}
}