#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
int n, q;
char st[200009];
set<int> s[3];
int type(char c) {
  if (c == 'R') return 0;
  if (c == 'S') return 1;
  return 2;
}
int bad(int x) { return (x + 2) % 3; }
int good(int x) { return (x + 1) % 3; }
struct tree {
  int F[200009];
  void upd(int x, int v) {
    for (; x < 200009; x += x & (-x)) F[x] += v;
  }
  int tap(int x) {
    int res = 0;
    for (; x; x -= x & (-x)) res += F[x];
    return res;
  }
  int get(int l, int r) {
    if (l > r) return 0;
    return tap(r) - tap(l - 1);
  }
} f[3];
void solve() {
  int res = 0;
  for (int i = 0; i < 3; i++)
    if (s[bad(i)].size()) {
      if (s[good(i)].size() == 0)
        res += f[i].get(1, n);
      else {
        res += f[i].get(*s[bad(i)].begin(), *s[good(i)].begin());
        res += f[i].get(*s[good(i)].rbegin(), *s[bad(i)].rbegin());
      }
    }
  printf("%d\n", n - res);
}
int main() {
  scanf("%d%d", &n, &q);
  scanf("%s", st + 1);
  for (int i = 1; i <= n; i++)
    s[type(st[i])].insert(i), f[type(st[i])].upd(i, +1);
  solve();
  while (q--) {
    int p;
    char c;
    scanf("%d %c", &p, &c);
    s[type(st[p])].erase(p);
    f[type(st[p])].upd(p, -1);
    st[p] = c;
    f[type(st[p])].upd(p, +1);
    s[type(st[p])].insert(p);
    solve();
  }
  return 0;
}
