/*字符置换,字符串中出现的连续两个“.”。若每次操作把其中最开始的连续两个“.”以一个“.”替代,
* 则可以将函数f(s) 定义为 使得串中不出现连续两个“.”的最小置换次数。
* 现考虑m个字符替换操作,每次将指定位置的字符替换为给定的字符,求替换后函数f(s)的值。
* 输入描述:输入有若干组,每组的第一行为两个整数n和m,1 <= n, m <= 300000,表示字符串的长度和字符替换操作的次数。
* 第二行为所给的字符串,随后紧跟m行操作,每行由一个正整数x和一个字母c构成,表示将字符串中位置m处的字符置换为字母c。
* 输出描述:对每组输入的每个置换操作,在单独的行中输出函数f(s)的结果
*/
#include <iostream>
#include <cstdio>
using namespace std;
char ch[300010];
int n, m;
int Cal(int x, char c)
{
x -= 1;
if (c == '.')
//点
{
if (ch[x] == '.')
{//点换点
ch[x] = c;
return 0;
}
else
{//点换字母
int rt = 0;
if (x - 1 >= 0 && ch[x - 1] == '.')
rt += 1;
if (x + 1<n && ch[x + 1] == '.')
rt += 1;
ch[x] = c;
return rt;
}
}
else if (c != '.')
{//字母
if (ch[x] != '.')
{//字母换字母无意义
ch[x] = c;
return 0;
}
else if (ch[x] == '.')
{//字母换点 左边有点少1 右边有点再少1
int rt = 0;
if (x - 1 >= 0 && ch[x - 1] == '.')
rt -= 1;
if (x + 1<n && ch[x + 1] == '.')
rt -= 1;
ch[x] = c;
return rt;
}
}
}
int main()
{
while (cin >> n >> m)
{
getchar();
int count = 0;
gets_s(ch);
for (int i = 0; i<n; i++)
{
if (ch[i] == '.'&&ch[i + 1] == '.')
{
count += 1;
}
}
//cout << count << endl;
int x;
char ct;
for (int i = 0; i<m; i++)
{
scanf_s("%d %c", &x, &ct);
//printf("%d %c\n",x,ct);
count += Cal(x, ct);
cout << count << endl;
}
}
}