import typing import sys input = sys.stdin.readline def _ceil_pow2(n: int) -> int: x = 0 while (1 << x) < n: x += 1 return x class SegTree: def __init__(self, op, e, lst): self.n = len(lst) self.N0 = 2 ** (self.n - 1).bit_length() self.op = op self.e = e self.data = [e] * (2 * self.N0) if type(lst) is list: for i in range(self.n): self.data[self.N0 + i] = lst[i] for i in range(self.N0 - 1, 0, -1): self.data[i] = self.op(self.data[2 * i], self.data[2 * i + 1]) def get(self, i): return self.data[self.N0 + i] def set(self, i, x): i += self.N0 self.data[i] = x while i > 1: i >>= 1 self.data[i] = self.op(self.data[2 * i], self.data[2 * i + 1]) def prod(self, l, r): if r <= l: return self.e lres = self.e rres = self.e l += self.N0 r += self.N0 while l < r: if l & 1: lres = self.op(lres, self.data[l]) l += 1 if r & 1: r -= 1 rres = self.op(self.data[r], rres) l >>= 1 r >>= 1 return self.op(lres, rres) INF = 1 << 60 N, Q = map(int, input().split()) S = input().strip() def identity(c): # dp = [[INF] * 4 for _ in range(4)] dp = [INF] * (4*4) k = ord(c) - ord('A') for i in range(4): for j in range(i, 4): if i <= k <= j: dp[i*4+j] = 0 else: dp[i*4+j] = 1 return dp # 二つの区間をマージ def op(a, b): # dp = [[INF] * 4 for _ in range(4)] dp = [INF] * (4*4) for i in range(4): for j in range(i, 4): for k in range(i, j+1): dp[i*4+j] = min(dp[i*4+j], a[i*4+k] + b[k*4+j]) return dp # e = [[0] * 4 for _ in range(4)] e = [0] * (4*4) segt = SegTree(op, e, [identity(c) for c in S]) for _ in range(Q): a = input().split() match a[0]: case '1': x = int(a[1]) - 1 c = a[2] segt.set(x, identity(c)) case '2': L, R = int(a[1])-1, int(a[2]) res = segt.prod(L, R) ans = min(res) print(ans) case _: assert False