For problem statement at 0-999/800-899/890-899/899/problemF.txt this is a correct solution, but verifier at 0-999/800-899/890-899/899/verifierF.go ends with panic: runtime error: index out of range [3] with length 3
goroutine 1 [running]:
main.solve({0x400012a700, 0x62})
/home/ubuntu/codeforces/0-999/800-899/890-899/899/verifierF.go:104 +0x810
main.generateTests()
/home/ubuntu/codeforces/0-999/800-899/890-899/899/verifierF.go:157 +0x2e4
main.main()
/home/ubuntu/codeforces/0-999/800-899/890-899/899/verifierF.go:188 +0x90
exit status 2 can you fix the verifier? package main
import (
"bufio"
"io"
"os"
"sort"
)
type FastScanner struct {
data []byte
idx int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data}
}
func (fs *FastScanner) skip() {
for fs.idx < len(fs.data) && fs.data[fs.idx] <= ' ' {
fs.idx++
}
}
func (fs *FastScanner) nextInt() int {
fs.skip()
val := 0
for fs.idx < len(fs.data) && fs.data[fs.idx] > ' ' {
val = val*10 + int(fs.data[fs.idx]-'0')
fs.idx++
}
return val
}
func (fs *FastScanner) nextBytes() []byte {
fs.skip()
start := fs.idx
for fs.idx < len(fs.data) && fs.data[fs.idx] > ' ' {
fs.idx++
}
return fs.data[start:fs.idx]
}
func (fs *FastScanner) nextByte() byte {
fs.skip()
b := fs.data[fs.idx]
for fs.idx < len(fs.data) && fs.data[fs.idx] > ' ' {
fs.idx++
}
return b
}
type Fenwick struct {
n int
tree []int
}
func NewFenwick(n int) *Fenwick {
f := &Fenwick{n: n, tree: make([]int, n+1)}
for i := 1; i <= n; i++ {
f.tree[i]++
j := i + (i & -i)
if j <= n {
f.tree[j] += f.tree[i]
}
}
return f
}
func (f *Fenwick) Add(i, delta int) {
for i <= f.n {
f.tree[i] += delta
i += i & -i
}
}
func (f *Fenwick) Kth(k int) int {
idx := 0
bit := 1
for bit<<1 <= f.n {
bit <<= 1
}
for bit > 0 {
nxt := idx + bit
if nxt <= f.n && f.tree[nxt] < k {
idx = nxt
k -= f.tree[nxt]
}
bit >>= 1
}
return idx + 1
}
func find(parent []int, x int) int {
for parent[x] != x {
parent[x] = parent[parent[x]]
x = parent[x]
}
return x
}
func main() {
fs := NewFastScanner()
n := fs.nextInt()
m := fs.nextInt()
s := fs.nextBytes()
pos := make([][]int, 256)
for i := 0; i < n; i++ {
pos[s[i]] = append(pos[s[i]], i+1)
}
parent := make([][]int, 256)
for c := 0; c < 256; c++ {
l := len(pos[c])
parent[c] = make([]int, l+1)
for i := 0; i <= l; i++ {
parent[c][i] = i
}
}
alive := make([]bool, n+1)
for i := 1; i <= n; i++ {
alive[i] = true
}
bit := NewFenwick(n)
for ; m > 0; m-- {
l := fs.nextInt()
r := fs.nextInt()
c := fs.nextByte()
L := bit.Kth(l)
R := bit.Kth(r)
list := pos[c]
par := parent[c]
idx := sort.SearchInts(list, L)
idx = find(par, idx)
for idx < len(list) && list[idx] <= R {
p := list[idx]
if alive[p] {
alive[p] = false
bit.Add(p, -1)
}
par[idx] = find(par, idx+1)
idx = find(par, idx)
}
}
out := make([]byte, 0, n)
for i := 1; i <= n; i++ {
if alive[i] {
out = append(out, s[i-1])
}
}
w := bufio.NewWriterSize(os.Stdout, 1<<20)
w.Write(out)
w.WriteByte('\n')
w.Flush()
}