#include <iostream>
#include <vector>
#include <set>
using namespace std;
void upd(int i, int j, vector<vector<int>>& dp, vector<set<pair<int, int>>>& lvl, vector<vector<int>> &a) {
if ((i >= dp.size()) || (j >= dp[0].size())) return;
if ((i < 0) || (j < 0)) return;
int ov = dp[i][j];
dp[i][j] = dp[i][j + 1] | dp[i + 1][j] & (!a[i][j]);
if (ov != dp[i][j]) {
upd(i - 1, j, dp, lvl, a), upd(i, j - 1, dp, lvl, a);
if (dp[i][j] == 0) 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>> dp(n + 1, vector<int>(m + 1, 0));
for (auto& x : a) for (auto& y : x) cin >> y;
dp[n][m - 1] = 1;
for (int i = n - 1; i >= 0; --i)
for (int j = m - 1; j >= 0; --j)
dp[i][j] = (dp[i + 1][j] | dp[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 (dp[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;
dp[i][j] = 0, lvl[i + j].erase({ i, j });
upd(i - 1, j, dp, lvl, a), upd(i, j - 1, dp, lvl, a);
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |