← Home
package main

import (
	"bytes"
	"container/heap"
	"io"
	"os"
)

type MinHeap []int

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
func (h *MinHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}
func (h *MinHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[:n-1]
	return x
}

type MaxHeap []int

func (h MaxHeap) Len() int           { return len(h) }
func (h MaxHeap) Less(i, j int) bool { return h[i] > h[j] }
func (h MaxHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
func (h *MaxHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}
func (h *MaxHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[:n-1]
	return x
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0

	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		x := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			x = x*10 + int(data[p]-'0')
			p++
		}
		return x
	}

	nextString := func() string {
		for p < len(data) && (data[p] == ' ' || data[p] == '\n' || data[p] == '\r' || data[p] == '\t') {
			p++
		}
		start := p
		for p < len(data) && data[p] != ' ' && data[p] != '\n' && data[p] != '\r' && data[p] != '\t' {
			p++
		}
		return string(data[start:p])
	}

	n := nextInt()
	q := nextInt()
	s := []byte(nextString())

	active := make([]bool, 0)
	if n > 1 {
		active = make([]bool, n-1)
	}

	minH := &MinHeap{}
	maxH := &MaxHeap{}
	heap.Init(minH)
	heap.Init(maxH)

	cnt := 0

	for i := 0; i+1 < n; i++ {
		if s[i] == s[i+1] {
			active[i] = true
			cnt++
			heap.Push(minH, i)
			heap.Push(maxH, i)
		}
	}

	refresh := func(i int) {
		if i < 0 || i >= n-1 {
			return
		}
		eq := s[i] == s[i+1]
		if eq {
			if !active[i] {
				active[i] = true
				cnt++
				heap.Push(minH, i)
				heap.Push(maxH, i)
			}
		} else {
			if active[i] {
				active[i] = false
				cnt--
			}
		}
	}

	pruneMin := func() {
		for minH.Len() > 0 && !active[(*minH)[0]] {
			heap.Pop(minH)
		}
	}

	pruneMax := func() {
		for maxH.Len() > 0 && !active[(*maxH)[0]] {
			heap.Pop(maxH)
		}
	}

	check := func() bool {
		if n%2 == 1 {
			return false
		}
		if s[0] != '(' || s[n-1] != ')' {
			return false
		}
		if cnt == 0 {
			return true
		}
		pruneMin()
		pruneMax()
		return (*minH)[0]%2 == 0 && (*maxH)[0]%2 == 0
	}

	var out bytes.Buffer

	for ; q > 0; q-- {
		pos := nextInt() - 1
		if s[pos] == '(' {
			s[pos] = ')'
		} else {
			s[pos] = '('
		}
		refresh(pos - 1)
		refresh(pos)
		if check() {
			out.WriteString("YES\n")
		} else {
			out.WriteString("NO\n")
		}
	}

	os.Stdout.Write(out.Bytes())
}