#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
#define f0(i,n) for(int i=0;i<n;++i)
#define f1(i,n) for(int i=1;i<=n;++i)
#define fi first
#define se second
#define pai pair<int,int>
using namespace std;
const int MOD=1e9+7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r){
static uniform_int_distribution<int> d;
return d(rng,uniform_int_distribution<int>::param_type(l,r));
}
const int MAXN = 100005;
ll st[4 * MAXN];
bool lazy_set[4 * MAXN];
ll lazy_val[4 * MAXN];
int n;
ll a[MAXN + 5];
void build(int id, int l, int r) {
lazy_set[id] = false;
if (l == r) {
st[id] = a[l]-a[l-1];
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
st[id] = st[id << 1] + st[id << 1 | 1];
}
void push(int id, int l, int r) {
if (!lazy_set[id] || l == r) return;
int mid = (l + r) >> 1;
ll v = lazy_val[id];
st[id << 1] = (mid - l + 1) * v;
lazy_set[id << 1] = true;
lazy_val[id << 1] = v;
st[id << 1 | 1] = (r - mid) * v;
lazy_set[id << 1 | 1] = true;
lazy_val[id << 1 | 1] = v;
lazy_set[id] = false;
}
void update1(int id, int l, int r, int u, int v, ll val) {
if (r < u || v < l) return;
if (u <= l && r <= v) {
st[id] = (r - l + 1) * val;
lazy_set[id] = true;
lazy_val[id] = val;
return;
}
push(id, l, r);
int mid = (l + r) >> 1;
update1(id << 1, l, mid, u, v, val);
update1(id << 1 | 1, mid + 1, r, u, v, val);
st[id] = st[id << 1] + st[id << 1 | 1];
}
void update2(int id, int l, int r, int pos, ll val) {
if (l == r) {
st[id] = val;
lazy_set[id] = false;
return;
}
push(id, l, r);
int mid = (l + r) >> 1;
if (pos <= mid) update2(id << 1, l, mid, pos, val);
else update2(id << 1 | 1, mid + 1, r, pos, val);
st[id] = st[id << 1] + st[id << 1 | 1];
}
ll query(int id, int l, int r, int u, int v) {
if (r < u || v < l) return 0;
if (u <= l && r <= v) return st[id];
push(id, l, r);
int mid = (l + r) >> 1;
return query(id << 1, l, mid, u, v)
+ query(id << 1 | 1, mid + 1, r, u, v);
}
int main(){
//freopen(".INP","r",stdin);
//freopen(".OUT","w",stdout);
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(0);
int n,q;
cin>>n>>q;
string s;
cin>>s;
a[1]=1;
f1(i,n-1){
if(s[i]!=s[i-1]) a[i+1]=a[i]+1;
else a[i+1]=a[i];
}
build(1,1,n);
while(q--){
string t;
cin>>t;
if(t=="change"){
int l,r;
char c;
cin>>l>>r>>c;
if (l + 1 <= r) update1(1, 1, n, l + 1, r, 0);
if (l > 1) {
ll v = (s[l-2] != c);
update2(1, 1, n, l, v);
}
if (r < n) {
ll v = (c != s[r]);
update2(1, 1, n, r + 1, v);
}
for (int i = l-1; i <= r-1; i++) s[i] = c;
}
else {
int l, r;
cin >> l >> r;
ll ans = 1;
if (l + 1 <= r) ans += query(1, 1, n, l + 1, r);
cout << ans <<endl;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZW5kbCAnXG4nCiNkZWZpbmUgZjAoaSxuKSBmb3IoaW50IGk9MDtpPG47KytpKQojZGVmaW5lIGYxKGksbikgZm9yKGludCBpPTE7aTw9bjsrK2kpCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwYWkgcGFpcjxpbnQsaW50Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgTU9EPTFlOSs3OwptdDE5OTM3IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwppbnQgcm5kKGludCBsLGludCByKXsKICAgIHN0YXRpYyB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkOwogICAgcmV0dXJuIGQocm5nLHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+OjpwYXJhbV90eXBlKGwscikpOwp9CmNvbnN0IGludCBNQVhOID0gMTAwMDA1OwoKbGwgc3RbNCAqIE1BWE5dOwpib29sIGxhenlfc2V0WzQgKiBNQVhOXTsKbGwgbGF6eV92YWxbNCAqIE1BWE5dOwoKaW50IG47CmxsIGFbTUFYTiArIDVdOwp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBsYXp5X3NldFtpZF0gPSBmYWxzZTsKICAgIGlmIChsID09IHIpIHsKICAgICAgICBzdFtpZF0gPSBhW2xdLWFbbC0xXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgYnVpbGQoaWQgPDwgMSwgbCwgbWlkKTsKICAgIGJ1aWxkKGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByKTsKICAgIHN0W2lkXSA9IHN0W2lkIDw8IDFdICsgc3RbaWQgPDwgMSB8IDFdOwp9Cgp2b2lkIHB1c2goaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmICghbGF6eV9zZXRbaWRdIHx8IGwgPT0gcikgcmV0dXJuOwoKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBsbCB2ID0gbGF6eV92YWxbaWRdOwoKICAgIHN0W2lkIDw8IDFdID0gKG1pZCAtIGwgKyAxKSAqIHY7CiAgICBsYXp5X3NldFtpZCA8PCAxXSA9IHRydWU7CiAgICBsYXp5X3ZhbFtpZCA8PCAxXSA9IHY7CgogICAgc3RbaWQgPDwgMSB8IDFdID0gKHIgLSBtaWQpICogdjsKICAgIGxhenlfc2V0W2lkIDw8IDEgfCAxXSA9IHRydWU7CiAgICBsYXp5X3ZhbFtpZCA8PCAxIHwgMV0gPSB2OwoKICAgIGxhenlfc2V0W2lkXSA9IGZhbHNlOwp9CnZvaWQgdXBkYXRlMShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBsbCB2YWwpIHsKICAgIGlmIChyIDwgdSB8fCB2IDwgbCkgcmV0dXJuOwoKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSB7CiAgICAgICAgc3RbaWRdID0gKHIgLSBsICsgMSkgKiB2YWw7CiAgICAgICAgbGF6eV9zZXRbaWRdID0gdHJ1ZTsKICAgICAgICBsYXp5X3ZhbFtpZF0gPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHB1c2goaWQsIGwsIHIpOwogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIHVwZGF0ZTEoaWQgPDwgMSwgbCwgbWlkLCB1LCB2LCB2YWwpOwogICAgdXBkYXRlMShpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgdSwgdiwgdmFsKTsKICAgIHN0W2lkXSA9IHN0W2lkIDw8IDFdICsgc3RbaWQgPDwgMSB8IDFdOwp9CnZvaWQgdXBkYXRlMihpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHBvcywgbGwgdmFsKSB7CiAgICBpZiAobCA9PSByKSB7CiAgICAgICAgc3RbaWRdID0gdmFsOwogICAgICAgIGxhenlfc2V0W2lkXSA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBwdXNoKGlkLCBsLCByKTsKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBpZiAocG9zIDw9IG1pZCkgdXBkYXRlMihpZCA8PCAxLCBsLCBtaWQsIHBvcywgdmFsKTsKICAgIGVsc2UgdXBkYXRlMihpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgcG9zLCB2YWwpOwogICAgc3RbaWRdID0gc3RbaWQgPDwgMV0gKyBzdFtpZCA8PCAxIHwgMV07Cn0KbGwgcXVlcnkoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewogICAgaWYgKHIgPCB1IHx8IHYgPCBsKSByZXR1cm4gMDsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc3RbaWRdOwoKICAgIHB1c2goaWQsIGwsIHIpOwogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIHJldHVybiBxdWVyeShpZCA8PCAxLCBsLCBtaWQsIHUsIHYpCiAgICAgICAgICsgcXVlcnkoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYpOwp9CmludCBtYWluKCl7CgkvL2ZyZW9wZW4oIi5JTlAiLCJyIixzdGRpbik7CgkvL2ZyZW9wZW4oIi5PVVQiLCJ3IixzdGRvdXQpOwogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOyBjb3V0LnRpZSgwKTsKICAgCiAgICBpbnQgbixxOwogICAgY2luPj5uPj5xOwogICAgc3RyaW5nIHM7CiAgICBjaW4+PnM7CgogICAgYVsxXT0xOwogICAgZjEoaSxuLTEpewogICAgCWlmKHNbaV0hPXNbaS0xXSkgYVtpKzFdPWFbaV0rMTsKICAgIAllbHNlIGFbaSsxXT1hW2ldOwoJfQoJYnVpbGQoMSwxLG4pOwoJd2hpbGUocS0tKXsKCQlzdHJpbmcgdDsKCQljaW4+PnQ7CgkJaWYodD09ImNoYW5nZSIpewoJCQlpbnQgbCxyOwoJCQljaGFyIGM7CgkJCWNpbj4+bD4+cj4+YzsKCQkJaWYgKGwgKyAxIDw9IHIpIHVwZGF0ZTEoMSwgMSwgbiwgbCArIDEsIHIsIDApOwogICAgICAgICAgICBpZiAobCA+IDEpIHsKICAgICAgICAgICAgICAgIGxsIHYgPSAoc1tsLTJdICE9IGMpOwogICAgICAgICAgICAgICAgdXBkYXRlMigxLCAxLCBuLCBsLCB2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAociA8IG4pIHsKICAgICAgICAgICAgICAgIGxsIHYgPSAoYyAhPSBzW3JdKTsKICAgICAgICAgICAgICAgIHVwZGF0ZTIoMSwgMSwgbiwgciArIDEsIHYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaW50IGkgPSBsLTE7IGkgPD0gci0xOyBpKyspIHNbaV0gPSBjOwoJICAgIH0KCSAgICBlbHNlIHsgCgkgICAgICAgIGludCBsLCByOwoJICAgICAgICBjaW4gPj4gbCA+PiByOwoJICAgICAgICBsbCBhbnMgPSAxOwoJICAgICAgICBpZiAobCArIDEgPD0gcikgYW5zICs9IHF1ZXJ5KDEsIDEsIG4sIGwgKyAxLCByKTsKCSAgICAgICAgY291dCA8PCBhbnMgPDxlbmRsOwoJICAgIH0KCQkKCX0KICAgIHJldHVybiAwOwp9Cg==