#include <iostream>
#include <vector>
#include <set>
using namespace std;
void upd1(int i, int j, vector<vector<int>>& dp1, vector<vector<int>>& dp2, vector<set<pair<int, int>>>& lvl, vector<vector<int>> &a, int n, int m) {
if ((i >= n) || (j >= m)) return;
if ((i < 0) || (j < 0)) return;
int ov = dp1[i][j];
dp1[i][j] = (((i == (n - 1))? 0: dp1[i + 1][j]) | (((j == (m - 1)) ? 0 : dp1[i][j + 1]))) & (~a[i][j]);
if (ov != dp1[i][j]) upd1(i - 1, j, dp1, dp2, lvl, a, n, m), upd1(i, j - 1, dp1, dp2, lvl, a, n, m);
if (!(dp1[i][j] && dp2[i][j]))
if (lvl[i + j].find({ i, j }) != lvl[i + j].end())
lvl[i + j].erase({ i, j });
}
void upd2(int i, int j, vector<vector<int>>& dp1, vector<vector<int>>& dp2, vector<set<pair<int, int>>>& lvl, vector<vector<int>>& a, int n, int m) {
if ((i >= n) || (j >= m)) return;
if ((i < 0) || (j < 0)) return;
int ov = dp2[i][j];
dp2[i][j] = (((i == 0) ? 0 : dp2[i - 1][j]) | (((j == 0) ? 0 : dp2[i][j - 1]))) & (~a[i][j]);
if (ov != dp2[i][j]) upd2(i + 1, j, dp1, dp2, lvl, a, n, m), upd2(i, j + 1, dp1, dp2, lvl, a, n, m);
if (!(dp1[i][j] && dp2[i][j]))
if (lvl[i + j].find({ i, j }) != lvl[i + j].end())
lvl[i + j].erase({ i, j });
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m; cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
vector<vector<int>> dp1(n, vector<int>(m, 0)), dp2(n, vector<int>(m, 0));
for (auto& x : a) for (auto& y : x) cin >> y;
dp1[n - 1][m - 1] = dp2[0][0] = 1;
for (int i = n - 1; i >= 0; --i)
for (int j = m - 1; j >= 0; --j)
if((i + j) != (n + m - 2))
dp1[i][j] = (((i == (n - 1)) ? 0 : dp1[i + 1][j]) | (((j == (m - 1)) ? 0 : dp1[i][j + 1]))) & (~a[i][j]);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if((i + j))
dp2[i][j] = (((i == 0) ? 0 : dp2[i - 1][j]) | (((j == 0) ? 0 : dp2[i][j - 1]))) & (~a[i][j]);
vector<set<pair<int, int>>> lvl(n + m);
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (dp1[i][j] && dp2[i][j]) lvl[i + j].insert({i, j});
int q; cin >> q;
while (q--) {
int i, j; cin >> i >> j; --i, --j;
if ((lvl[i + j].size() == 1) && ((*lvl[i + j].begin()) == make_pair(i, j)))
cout << 0 << endl;
else {
cout << 1 << endl;
dp1[i][j] = dp2[i][j] = 0, a[i][j] = 1;
if (lvl[i + j].find({ i, j }) != lvl[i + j].end()) lvl[i + j].erase({ i, j });
upd1(i - 1, j, dp1, dp2, lvl, a, n, m), upd1(i, j - 1, dp1, dp2, lvl, a, n, m);
upd2(i + 1, j, dp1, dp2, lvl, a, n, m), upd2(i, j + 1, dp1, dp2, lvl, a, n, m);
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |