#include <bits/stdc++.h>
using namespace std;
int const NMAX=1005;
bool drum1[NMAX][NMAX],drum2[NMAX][NMAX];
int n,m;
void read(){
cin>>n>>m;
int i,j;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j){
bool val;
cin>>val;
drum1[i][j]=drum2[i][j]=!val;
}
}
int diag[2*NMAX];
bool check1(int l,int c){
return (drum1[l-1][c]|drum1[l][c-1]);
}
bool check2(int l,int c){
return (drum2[l+1][c]|drum2[l][c+1]);
}
void init(){
int i,j;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(drum1[i][j] && !(i==1 && j==1))
drum1[i][j]=check1(i,j);
for(i=n;i;--i)
for(j=m;j;--j)
if(drum2[i][j] && !(i==n && j==m))
drum2[i][j]=check2(i,j);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(drum1[i][j] && drum2[i][j])
++diag[i+j];
}
void deactivate1(int l,int c){
if(drum2[l][c])
--diag[l+c];
drum1[l][c]=0;
if(drum1[l+1][c] && !check1(l+1,c))
deactivate1(l+1,c);
if(drum1[l][c+1] && !check1(l,c+1))
deactivate1(l,c+1);
}
void deactivate2(int l,int c){
if(drum1[l][c])
--diag[l+c];
drum2[l][c]=0;
if(drum2[l-1][c] && !check2(l-1,c))
deactivate2(l-1,c);
if(drum2[l][c-1] && !check2(l,c-1))
deactivate2(l,c-1);
}
void process_queries(){
int q;
cin>>q;
while(q--){
int l,c;
cin>>l>>c;
if(drum1[l][c] && drum2[l][c] && diag[l+c]==1){
cout<<0<<'\n';
continue;
}
cout<<1<<'\n';
if(drum1[l][c])
deactivate1(l,c);
if(drum2[l][c])
deactivate2(l,c);
}
}
int main()
{
read();
init();
process_queries();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |