用bitset写,容易理解
读入01串,修改时改变对应位置

#include<iostream>
#include<cstdio>
#include<bitset>
#include<algorithm>
typedef long long ll;
using namespace std;
inline long long read() { long long s = 0, w = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') w = -1; for (; isdigit(ch); ch = getchar())    s = (s << 1) + (s << 3) + (ch ^ 48); return s * w; }
enum { maxn = 10 };
bitset<maxn> a[maxn];
int n, m, t;
bitset<maxn> temp1, temp2;
int main() {
    n = read(), m = read();
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            a[i] <<= 1;
            t = read();
            a[i] |= t;
        }
    }//读入01串
    int op, x1, x2, y1, y2;
    while (m--) {
        op = read(); 
        x1 = read(); 
        y1 = read();
        if (op == 1) { a[x1 - 1][n-y1] = ~a[x1 - 1][n-y1];//对应位置直接取反 
        //cout << "After change:" << endl;
        //for (int i = 0; i < n; ++i) cout << a[i]<<endl;
        }
        else {
            x2 = read(), y2 = read();
            temp1.reset();
            temp1 = temp2 = ~temp1;
            if (y1 > y2) swap(y1, y2);
            temp1 <<= n-y2, temp2 <<= n-y1+1;
            temp2 = (~temp2) & temp1;
//对于每一列,把所求区间置为1,后面直接位运算&+bitset::count()可以获取这一行对应区间1的个数
            int ans = 0;
            //cout << "temp2=" << temp2 << endl;
            //cout << "count matraix:" << endl;
            for (int i = x1 - 1; i <= x2 - 1; ++i) {
                ans += (a[i] & temp2).count();
                //cout << (a[i] & temp2) << "\t" << (a[i] & temp2).count() << endl;
            }
            cout << ans << endl;
        }
    }
    return 0;
}