Submission #1255426

#TimeUsernameProblemLanguageResultExecution timeMemory
1255426kamradFurniture (JOI20_furniture)C++20
0 / 100
38 ms80452 KiB
#include <bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma,tune=native")

using ll  = long long;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pi3 = pair<pii, int>;

#define IOS               ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define F                 first
#define S                 second
#define sz(x)             x.size()
#define all(x)            x.begin(), x.end()
#define pb                push_back
#define minr(a, b)        a = min(a, b);
#define maxr(a, b)        a = max(a, b);
#define shit              cout << "shit\n" << flush;
#define tl                while(1&1) continue;
#define rand(l, r)        uniform_int_distribution<int64_t>(l,r)(rng)
random_device device;     default_random_engine rng(device());

const int Mod    = 1e9 + 7; //998244353;
const int LG     = 64;
const int SQ     = 500;
const int Inf    = 2e9 + 10;
const int maxN   = 1e3 + 10;
const int maxNM  = 1e6 + 10;

int n, m;
int q;
int idx[maxN][maxN];

bool c[maxN][maxN];
bool mark[maxN][maxN];

vector <pii> topol;
vector <pii> neighb[maxN][maxN];
vector <pii> bneighb[maxN][maxN];

struct SegTree {
	struct Node {
		int lazy;
		int mn;
		Node() {
			lazy = 0; 
			mn = 0;
		}
	} t[maxNM<<2];

	void spread(int id, int L, int R) {
		if(L+1 == R)
			return;

		t[2*id+0].lazy += t[id].lazy;
		t[2*id+0].mn += t[id].lazy;
		t[2*id+1].lazy += t[id].lazy;
		t[2*id+1].mn += t[id].lazy;
		t[id].lazy = 0;
	}

	void update(int id, int L, int R, int l, int r, int val) {
		spread(id, L, R);
		if(L == l and R == r) {
			t[id].mn += val;
			t[id].lazy += val;
			return;
		}

		int mid = (L+R)>>1;
		if(l < mid)
			update(2*id+0, L, mid, l, min(mid, r), val);
		if(r > mid)
			update(2*id+1, mid, R, max(l, mid), r, val);
		t[id].mn = min(t[2*id+0].mn, t[2*id+1].mn);
	}
} s;

void dfs(int x, int y) {
	mark[x][y] = true;
	for(auto [x2, y2] : neighb[x][y])
		if(!mark[x2][y2] and c[x2][y2])
			dfs(x2, y2);
	topol.pb({x, y});
}

int main() {
	IOS;
	
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			cin >> c[i][j];
			c[i][j] = !c[i][j];
		}
	}
	
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			if(c[i][j]) {
				if(c[i+1][j]) {
					neighb[i][j].pb({i+1, j});
					bneighb[i+1][j].pb({i, j});
				}
				if(c[i][j+1]) {
					neighb[i][j].pb({i, j+1});
					bneighb[i][j+1].pb({i, j});
				}
			}
		}
	}
	
	dfs(1, 1);
	reverse(all(topol));
	vector <pii> tmp;
	bool check = false;
	for(auto x : topol) {
		if(!check)
			tmp.pb(x);
		else
			mark[x.F][x.S] = false;
		
		if(x == pii(n, m))
			check = true;
	}
	topol = tmp;
	
	int k = sz(topol);
	for(int i = 0; i < k; i++) {
		idx[topol[i].F][topol[i].S] = i+1;
	}

	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			if(!mark[i][j])
				continue;
			for(auto [x, y] : neighb[i][j])
				if(mark[x][y])
					s.update(1, 1, k, idx[i][j], idx[x][y], 1);
		}
	}

	cin >> q;
	while(q--) {
		int x, y;
		cin >> x >> y;
		if(!mark[x][y]) {
			c[x][y] = 0;
			cout << "1\n";
			continue;
		}

		vector <pii> act;
		for(auto [x2, y2] : neighb[x][y])
			if(mark[x2][y2] and c[x2][y2])
				act.pb({idx[x][y], idx[x2][y2]});
		for(auto [x2, y2] : bneighb[x][y])
			if(mark[x2][y2] and c[x2][y2])
				act.pb({idx[x2][y2], idx[x][y]});

		for(auto [l, r] : act)
			s.update(1, 1, k, l, r, -1);
		if(s.t[1].mn != 0) {
			c[x][y] = 0;
			cout << "1\n";
			continue;
		}
		for(auto [l, r] : act)
			s.update(1, 1, k, l, r, +1);
		cout << "0\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...