```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
var (
n, m int
seed int64
vmax int64
nodes []node
)
type node struct {
l, r int
v int64
}
func rnd() int64 {
ret := seed
seed = (seed*7 + 13) % 1000000007
return ret
}
func split(pos int) int {
idx := sort.Search(len(nodes), func(i int) bool {
return nodes[i].l >= pos
})
if idx < len(nodes) && nodes[idx].l == pos {
return idx
}
idx--
if idx < 0 {
return 0
}
if nodes[idx].r < pos {
return idx + 1
}
R, V := nodes[idx].r, nodes[idx].v
nodes[idx].r = pos - 1
newNode := node{l: pos, r: R, v: V}
nodes = append(nodes, node{})
copy(nodes[idx+2:], nodes[idx+1:])
nodes[idx+1] = newNode
return idx + 1
}
func assign(l, r int, v int64) {
itrL := split(l)
itrR := split(r + 1)
nodes[itrL].r = r
nodes[itrL].v = v
if itrL+1 < itrR {
nodes = append(nodes[:itrL+1], nodes[itrR:]...)
}
}
func add(l, r int, v int64) {
itrL := split(l)
itrR := split(r + 1)
for i := itrL; i < itrR; i++ {
nodes[i].v += v
}
}
type pair struct {
v int64
c int
}
func kth(l, r, k int) int64 {
itrL := split(l)
itrR := split(r + 1)
var ps []pair
for i := itrL; i < itrR; i++ {
ps = append(ps, pair{v: nodes[i].v, c: nodes[i].r - nodes[i].l + 1})
}
sort.Slice(ps, func(i, j int) bool {
return ps[i].v < ps[j].v
})
for _, p := range ps {
if k <= p.c {
return p.v
}
k -= p.c
}
return -1
}
func fastPow(a, b, m int64) int64 {
res := int64(1)
a %= m
for b > 0 {
if b&1 == 1 {
res = (res * a) % m
}
a = (a * a) % m
b >>= 1
}
return res
}
func sumPow(l, r, x, y int) int64 {
itrL := split(l)
itrR := split(r + 1)
var res int64
mod := int64(y)
exp := int64(x)
for i := itrL; i < itrR; i++ {
cnt := int64(nodes[i].r - nodes[i].l + 1)
val := fastPow(nodes[i].v, exp, mod)
res = (res + cnt*val) % mod
}
return res
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
fmt.Fscan(reader, &n, &m, &seed, &vmax)
nodes = make([]node, n)
for i := 1; i <= n; i++ {
nodes[i-1] = node{l: i, r: i, v: (rnd() % vmax) + 1}
}
for i := 0; 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
}
switch op {
case 1:
add(l, r, x)
case 2:
assign(l, r, x)
case 3:
fmt.Fprintln(writer, kth(l, r, int(x)))
case 4:
fmt.Fprintln(writer, sumPow(l, r, int(x), int(y)))
}
}
}
```