```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Fenwick struct {
tree []int64
}
func NewFenwick(size int) *Fenwick {
return &Fenwick{make([]int64, size+1)}
}
func (f *Fenwick) Update(idx int, delta int64) {
for idx < len(f.tree) {
f.tree[idx] += delta
idx += idx & -idx
}
}
func (f *Fenwick) Query(idx int) int64 {
var sum int64
for idx > 0 {
sum += f.tree[idx]
idx -= idx & -idx
}
return sum
}
func main() {
reader := bufio.NewReader(os.Stdin)
line, _ := reader.ReadString('\n')
parts := strings.Fields(line)
n, _ := strconv.Atoi(parts[0])
m, _ := strconv.Atoi(parts[1])
q, _ := strconv.Atoi(parts[2])
grid := make([][]byte, n)
for i := 0; i < n; i++ {
line, _ = reader.ReadString('\n')
grid[i] = []byte(strings.TrimSpace(line))
}
ft := NewFenwick(m)
var K int
for j := 0; j < m; j++ {
var c int64
for i := 0; i < n; i++ {
if grid[i][j] == '*' {
c++
}
}
ft.Update(j+1, c)
K += int(c)
}
var sb strings.Builder
for qi := 0; qi < q; qi++ {
line, _ = reader.ReadString('\n')
parts = strings.Fields(line)
x, _ := strconv.Atoi(parts[0])
y, _ := strconv.Atoi(parts[1])
row := x - 1
col := y - 1
var delta int64
if grid[row][col] == '*' {
grid[row][col] = '.'
delta = -1
} else {
grid[row][col] = '*'
delta = 1
}
ft.Update(y, delta)
K += int(delta)
full := K / n
rem := K % n
var correct int64
if full > 0 {
correct = ft.Query(full)
}
part := full + 1
if rem > 0 && part <= m {
for r := 0; r < rem; r++ {
if grid[r][part-1] == '*' {
correct++
}
}
}
moves := K - int(correct)
sb.WriteString(strconv.Itoa(moves) + " ")
}
fmt.Print(sb.String())
}
```