#include<bits/stdc++.h>
using namespace std;
struct tree
{
int w,b,ls[205],rs[205];
}tr[805];
int n,x,y,m,a[205][205],fa[40005];
int id(int i,int j){return (i-1)*n+j;}
int find(int x)
{
if(x!=fa[x])fa[x]=find(fa[x]);
return fa[x];
}
void pushup(int k,int l,int r)
{
for(int i=1;i<=n;i++)
{
tr[k].ls[i]=tr[k<<1].ls[i];
tr[k].rs[i]=tr[k<<1|1].rs[i];
//fa[tr[k<<1].ls[i]]=tr[k<<1].ls[i];
//fa[tr[k<<1].rs[i]]=tr[k<<1].rs[i];
//fa[tr[k<<1|1].ls[i]]=tr[k<<1|1].ls[i];
//fa[tr[k<<1|1].rs[i]]=tr[k<<1|1].rs[i];
}
tr[k].b=tr[k<<1].b+tr[k<<1|1].b;
tr[k].w=tr[k<<1].w+tr[k<<1|1].w;
int mid=(l+r)>>1;
for(int i=1;i<=n;i++)
{
if(a[mid][i]!=a[mid+1][i])continue;
int l=find(tr[k<<1].rs[i]),r=find(tr[k<<1|1].ls[i]);
if(l==r)continue;
fa[l]=r;
if(a[mid][i]==0)tr[k].w--;
else tr[k].b--;
}
//for(int i=1;i<=n;i++)tr[k].ls[i]=find(tr[k].ls[i]),tr[k].rs[i]=find(tr[k].rs[i]);
}
void build(int k,int l,int r)
{
if(l==r)
{
for(int i=1;i<=n;i++)
{
tr[k].ls[i]=tr[k].rs[i]=fa[id(l,i)]=id(l,i);
if(a[l][i]==0)tr[k].w++;
else tr[k].b++;
}
for(int i=2;i<=n;i++)
{
if(a[l][i]!=a[l][i-1])continue;
tr[k].ls[i]=tr[k].rs[i]=fa[id(l,i)]=fa[id(l,i-1)];
if(a[l][i]==0)tr[k].w--;
else tr[k].b--;
}
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k,l,r);
}
void change(int k,int l,int r,int x)
{
if(l==r)
{
tr[k].w=tr[k].b=0;
for(int i=1;i<=n;i++)
{
tr[k].ls[i]=tr[k].rs[i]=fa[id(x,i)]=id(x,i);
if(a[x][i]==0)tr[k].w++;
else tr[k].b++;
}
for(int i=2;i<=n;i++)
{
if(a[x][i]!=a[x][i-1])continue;
tr[k].ls[i]=tr[k].rs[i]=fa[id(x,i)]=fa[id(x,i-1)];
if(a[x][i]==0)tr[k].w--;
else tr[k].b--;
}
return;
}
int mid=(l+r)>>1;
if(x<=mid)change(k<<1,l,mid,x);
else change(k<<1|1,mid+1,r,x);
pushup(k,l,r);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
}
build(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
a[x][y]^=1;
change(1,1,n,x);
printf("%d %d\n",tr[1].b,tr[1].w);
}
return 0;
}
pushup 函数里面被注释掉的几行有什么作用,是为了干什么而写的,求解答/kel