← Home
```go
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	var t int
	scanner.Scan()
	fmt.Sscan(scanner.Text(), &t)
	for tc := 0; tc < t; tc++ {
		var n, q int
		scanner.Scan()
		fmt.Sscan(scanner.Text(), &n, &q)
		var str string
		scanner.Scan()
		fmt.Sscan(scanner.Text(), &str)
		s := str
		next0 := make([]int, n+2)
		next1 := make([]int, n+2)
		next0[n+1] = n + 2
		next1[n+1] = n + 2
		for i := n; i >= 1; i-- {
			if s[i-1] == '0' {
				next0[i] = i
			} else {
				next0[i] = next0[i+1]
			}
			if s[i-1] == '1' {
				next1[i] = i
			} else {
				next1[i] = next1[i+1]
			}
		}
		for qq := 0; qq < q; qq++ {
			var l, r int
			scanner.Scan()
			fmt.Sscan(scanner.Text(), &l, &r)
			k := r - l + 1
			t_str := s[l-1:r]
			ans := "NO"
			if k < 2 {
				fmt.Println(ans)
				continue
			}
			found := false
			for p1 := 1; !found && p1 <= n; p1++ {
				if s[p1-1] != t_str[0] {
					continue
				}
				start := p1 + 1
				if start > n {
					continue
				}
				c := t_str[k-1]
				curr := start
				success := true
				e := start - 1
				for i := 0; i < k-2; i++ {
					ch := t_str[i+1]
					var nxt int
					if ch == '0' {
						nxt = next0[curr]
					} else {
						nxt = next1[curr]
					}
					if nxt > n {
						success = false
						break
					}
					e = nxt
					curr = nxt + 1
				}
				if !success {
					continue
				}
				minz := start
				if e+1 > start {
					minz = e + 1
				}
				z_found := -1
				for z := n; z >= minz; z-- {
					if s[z-1] == c {
						z_found = z
						break
					}
				}
				if z_found != -1 && z_found >= p1+k {
					found = true
				}
			}
			if found {
				ans = "YES"
			}
			fmt.Println(ans)
		}
	}
}
```