← Home
```go
package main

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

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) readByte() byte {
	b, err := fs.r.ReadByte()
	if err != nil {
		return 0
	}
	return b
}

func (fs *FastScanner) NextInt() int {
	b := fs.readByte()
	for b <= ' ' {
		b = fs.readByte()
	}
	sign := 1
	if b == '-' {
		sign = -1
		b = fs.readByte()
	}
	n := 0
	for b >= '0' && b <= '9' {
		n = n*10 + int(b-'0')
		b = fs.readByte()
	}
	return sign * n
}

func (fs *FastScanner) NextString() string {
	b := fs.readByte()
	for b <= ' ' {
		b = fs.readByte()
	}
	buf := make([]byte, 0, 16)
	for b > ' ' {
		buf = append(buf, b)
		b = fs.readByte()
	}
	return string(buf)
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	T := in.NextInt()
	for ; T > 0; T-- {
		s1str := in.NextString()
		s2str := in.NextString()
		t := in.NextInt()
		q := in.NextInt()

		n := len(s1str)
		s1 := []byte(s1str)
		s2 := []byte(s2str)

		blocked := make([]bool, n)
		expiries := make([][]int, q+t+5)

		mismatch := 0
		for i := 0; i < n; i++ {
			if s1[i] != s2[i] {
				mismatch++
			}
		}

		for cur := 1; cur <= q; cur++ {
			for _, p := range expiries[cur] {
				if blocked[p] {
					blocked[p] = false
					if s1[p] != s2[p] {
						mismatch++
					}
				}
			}

			typ := in.NextInt()
			if typ == 1 {
				pos := in.NextInt() - 1
				if !blocked[pos] && s1[pos] != s2[pos] {
					mismatch--
				}
				blocked[pos] = true
				expiries[cur+t] = append(expiries[cur+t], pos)
			} else if typ == 2 {
				a := in.NextInt()
				p1 := in.NextInt() - 1
				b := in.NextInt()
				p2 := in.NextInt() - 1

				if p1 != p2 {
					if !blocked[p1] && s1[p1] != s2[p1] {
						mismatch--
					}
					if !blocked[p2] && s1[p2] != s2[p2] {
						mismatch--
					}
				} else {
					if !blocked[p1] && s1[p1] != s2[p1] {
						mismatch--
					}
				}

				if a == 1 && b == 1 {
					s1[p1], s1[p2] = s1[p2], s1[p1]
				} else if a == 2 && b == 2 {
					s2[p1], s2[p2] = s2[p2], s2[p1]
				} else if a == 1 && b == 2 {
					s1[p1], s2[p2] = s2[p2], s1[p1]
				} else { // a == 2 && b == 1
					s2[p1], s1[p2] = s1[p2], s2[p1]
				}

				if p1 != p2 {
					if !blocked[p1] && s1[p1] != s2[p1] {
						mismatch++
					}
					if !blocked[p2] && s1[p2] != s2[p2] {
						mismatch++
					}
				} else {
					if !blocked[p1] && s1[p1] != s2[p1] {
						mismatch++
					}
				}
			} else { // typ == 3
				if mismatch == 0 {
					fmt.Fprintln(out, "YES")
				} else {
					fmt.Fprintln(out, "NO")
				}
			}
		}
	}
}
```