← Home
package main

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

var (
	c4  []int
	c7  []int
	n47 []int
	n74 []int
	lz  []bool
	s   string
)

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func pushUp(v int) {
	l, r := 2*v, 2*v+1
	c4[v] = c4[l] + c4[r]
	c7[v] = c7[l] + c7[r]
	n47[v] = max(c4[l]+n47[r], n47[l]+c7[r])
	n74[v] = max(c7[l]+n74[r], n74[l]+c4[r])
}

func apply(v int) {
	c4[v], c7[v] = c7[v], c4[v]
	n47[v], n74[v] = n74[v], n47[v]
	lz[v] = !lz[v]
}

func pushDown(v int) {
	if lz[v] {
		apply(2 * v)
		apply(2*v + 1)
		lz[v] = false
	}
}

func build(v, tl, tr int) {
	if tl == tr {
		if s[tl] == '4' {
			c4[v] = 1
		} else {
			c7[v] = 1
		}
		n47[v] = 1
		n74[v] = 1
		return
	}
	tm := (tl + tr) / 2
	build(2*v, tl, tm)
	build(2*v+1, tm+1, tr)
	pushUp(v)
}

func update(v, tl, tr, l, r int) {
	if l > tr || r < tl {
		return
	}
	if l <= tl && tr <= r {
		apply(v)
		return
	}
	pushDown(v)
	tm := (tl + tr) / 2
	update(2*v, tl, tm, l, r)
	update(2*v+1, tm+1, tr, l, r)
	pushUp(v)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	scanner.Scan()
	m, _ := strconv.Atoi(scanner.Text())

	scanner.Scan()
	s = scanner.Text()

	c4 = make([]int, 4*n+1)
	c7 = make([]int, 4*n+1)
	n47 = make([]int, 4*n+1)
	n74 = make([]int, 4*n+1)
	lz = make([]bool, 4*n+1)

	build(1, 0, n-1)

	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	for i := 0; i < m; i++ {
		scanner.Scan()
		op := scanner.Text()
		if op == "count" {
			fmt.Fprintln(writer, n47[1])
		} else {
			scanner.Scan()
			l, _ := strconv.Atoi(scanner.Text())
			scanner.Scan()
			r, _ := strconv.Atoi(scanner.Text())
			update(1, 0, n-1, l-1, r-1)
		}
	}
}