#include <bits/stdc++.h>
using namespace std;
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }
template <typename T, typename V>
void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T>
void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto &i : x) cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v)) cerr << ", ";
  _print(v...);
}
const int N = 3e5 + 100;
int tree[N << 2];
void upd(int node, int st, int ed, int idx, int val) {
  if (st == ed) {
    tree[node] += val;
    return;
  }
  int mid = st + ed >> 1;
  if (idx <= mid) {
    upd(node << 1, st, mid, idx, val);
  } else {
    upd((node << 1) | 1, mid + 1, ed, idx, val);
  }
  tree[node] = tree[node << 1] + tree[(node << 1) | 1];
}
int query(int node, int st, int ed, int l, int r) {
  if (l > ed || r < st) {
    return 0;
  }
  if (l <= st && r >= ed) {
    return tree[node];
  }
  int mid = st + ed >> 1;
  int lft = query(node << 1, st, mid, l, r);
  int rgt = query((node << 1) | 1, mid + 1, ed, l, r);
  return lft + rgt;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, q;
  cin >> n >> q;
  string s;
  cin >> s;
  s = '#' + s;
  for (int i = 1; i <= n; i++) {
    if (s[i] == '.') {
      upd(1, 1, n, i, 1);
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    if (s[i] != '.') continue;
    int j = i;
    while (i <= n && s[i] == '.') i++;
    ans += i - j - 1;
  }
  while (q--) {
    int tmp = ans;
    int pos;
    char ch;
    cin >> pos >> ch;
    if (s[pos] == '.') {
      if (ch == '.') {
        cout << tmp << '\n';
        continue;
      }
      upd(1, 1, n, pos, -1);
      s[pos] = ch;
      int lo = pos, hi = n + 1;
      while (hi - lo > 1) {
        int mid = lo + hi >> 1;
        if (query(1, 1, n, pos + 1, mid) == mid - pos)
          lo = mid;
        else
          hi = mid;
      }
      int R = lo;
      lo = 0, hi = pos;
      while (hi - lo > 1) {
        int mid = lo + hi >> 1;
        if (query(1, 1, n, mid, pos - 1) == pos - mid)
          hi = mid;
        else
          lo = mid;
      }
      int L = hi;
      ans -= R - L;
      ans += max(0, R - pos - 1) + max(0, pos - L - 1);
      cout << ans << '\n';
    } else {
      if (ch != '.') {
        cout << tmp << '\n';
        continue;
      }
      upd(1, 1, n, pos, 1);
      s[pos] = '.';
      int lo = pos, hi = n + 1;
      while (hi - lo > 1) {
        int mid = lo + hi >> 1;
        if (query(1, 1, n, pos + 1, mid) == mid - pos)
          lo = mid;
        else
          hi = mid;
      }
      int R = lo;
      lo = 0, hi = pos;
      while (hi - lo > 1) {
        int mid = lo + hi >> 1;
        if (query(1, 1, n, mid, pos - 1) == pos - mid)
          hi = mid;
        else
          lo = mid;
      }
      int L = hi;
      ans -= max(0, R - pos - 1) + max(0, pos - L - 1);
      ans += R - L;
      cout << ans << '\n';
    }
  }
  return 0;
}
