```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)
}
}
}
```