Submission #1281919

#TimeUsernameProblemLanguageResultExecution timeMemory
1281919am_aadvikFurniture (JOI20_furniture)C++20
0 / 100
6 ms572 KiB
#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) {
    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];
    if (ov != dp[i][j]) {
        upd(i - 1, j, dp, lvl), upd(i, j - 1, dp, lvl);
        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), upd(i, j - 1, dp, lvl);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...