Link to this code:
https://cses.fi/paste/b6929fc3cd816569fb9b97/#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <vector>
#define test(x) cerr << "Line(" << __LINE__ << ") " #x << ' ' << x << endl
#define printv(x) \
{ \
for (auto i : x) cout << i << ' '; \
cout << endl; \
}
#define SQ(x) ((x) * (x))
#define SZ(x) ((int)x.size())
#define eb emplace_back
#define ALL(x) x.begin(), x.end()
#define rALL(x) x.begin(), x.end()
using namespace std;
using lli = long long int;
void solution() {
int N, Q; cin >> N >> Q;
function<int(int)> lowbit = [&](int x)->int {
return x & -x;
};
vector BIT(N+1, vector<lli> (N+1, 0));
vector grid(N+1, vector<int> (N+1, 0));
function<void(int, int, int)> upd = [&](int x, int y, int val)->void {
for (int _x = x; _x <= N; _x+=lowbit(_x)) {
for (int _y = y; _y <= N; _y+=lowbit(_y)) {
BIT[_x][_y] += val;
}
}
};
function<lli(int, int)> qry = [&](int x, int y)->lli {
if (x == 0 or y == 0) return 0;
lli res = 0;
for (int _x = x; _x > 0; _x-=lowbit(_x)) {
for (int _y = y; _y > 0; _y-=lowbit(_y)) {
res += BIT[_x][_y];
}
}
// test(res);
return res;
};
for (int i = 0; i < N; i++) {
string s; cin >> s;
for (int j = 0; j < N; j++) {
if (s[j] == '*') {
grid[i+1][j+1] = 1;
upd(i+1, j+1, +1);
}
}
}
while (Q-->0) {
int op; cin >> op;
if (op == 1) {
int y, x; cin >> y >> x;
if (grid[y][x]) {
grid[y][x] = 0;
upd(y, x, -1);
} else {
grid[y][x] = 1;
upd(y, x, +1);
}
} else if (op == 2) {
int y1, x1, y2, x2; cin >> y1 >> x1 >> y2 >> x2;
cout << qry(y2, x2) - qry(y2, x1-1) - qry(y1-1, x2) + qry(y1-1, x1-1) << '\n';
}
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
solution();
return 0;
}