#include <bits/stdc++.h>
#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i<b; i++)
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll;
#ifdef D
#define debug(x) cout << "debug -> "<< x
#else
#define debug(x) //nothing
#endif
const int MAXN = 100+5;
vector<pair<ll,ll>> oper = {{0,1},{1,0}};
vector<pair<ll,ll>> roper = {{0,-1},{-1,0}};
ll n,m;
vector<vector<ll>> mapa;
bool vis[MAXN][MAXN];
vector<pair<ll,ll>> llega[MAXN][MAXN];
bool dfs(ll i, ll j){
if(vis[i][j]) return SZ(llega[i][j])>0;
vis[i][j]=true;
if(i==n-1 && j==m-1) llega[i][j]={{-1,-1}};
for(auto o:oper) if(i+o.fst<n && j+o.snd<m){
if(mapa[i+o.fst][j+o.snd]==0 && dfs(i+o.fst,j+o.snd)){
llega[i][j].pb({i+o.fst,j+o.snd});
}
}
return SZ(llega[i][j])>0;
}
bool yes=false;
void rdfs(ll i, ll j){
if(i==0 && j==0){ yes=true; return; }
debug(i<<" "<<j<<'\n');
forn(k,0,2){
for(auto o:roper) if(i+o.fst>=0 && j+o.snd>=0){
if(k>=SZ(llega[i+o.fst][j+o.snd])) continue;
if(llega[i+o.fst][j+o.snd][k]==pair<ll,ll>{i,j}){
if(SZ(llega[i+o.fst][j+o.snd])==1){
rdfs(i+o.fst,j+o.snd);
}
if(!yes){
auto it = lower_bound(ALL(llega[i+o.fst][j+o.snd]),pair<ll,ll>{i,j});
llega[i+o.fst][j+o.snd].erase(it);
}
}
}
}
}
int main(){ FIN;
cin>>n>>m;
mapa.clear();
mapa.resize(n,vector<ll>(m));
forn(i,0,n){
forn(j,0,m){
cin>>mapa[i][j];
}
}
dfs(0,0);
ll q; cin>>q;
forn(i,0,q){
ll x,y; cin>>x>>y; x--; y--;
if(mapa[x][y]!=1){
mapa[x][y]=1;
/*mset(vis,false);
forn(I,0,n) forn(J,0,n) llega[I][J].clear();
if(!dfs(0,0)) mapa[x][y]=0, cout<<0<<'\n';
else cout<<1<<'\n';*/
yes=false;
rdfs(x,y);
if(yes){
cout<<0<<'\n';
}else{
cout<<1<<'\n';
}
}else{
cout<<0<<'\n';
}
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |