This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define PB push_back
#define ST first
#define ND second
//#pragma GCC optimize ("O3")
//#pragma GCC target("tune=native")
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
using namespace std;
using ll = long long;
using pi = pair<int, int>;
using vi = vector<int>;
int w, h, k;
vi g[(1 << 14)][14];
map<int, int>state;
int vis[(1 << 14)][14], cur;
int hsh[(1 << 14)];
vi masks;
void dfs(int mask, int row) {
	vis[mask][row] = cur;
	for(int m : g[mask][row]) {
		if(vis[m][row + 1] != cur) {
			dfs(m, row + 1);
		}
	}
}
map<int, vi>achieve;
void rozwaz(int ww) {
	cur++;
	int hs = 0;
	for(int m : masks) {
		hs ^= hsh[m];
	}
	vi good = {};
	if(achieve.count(hs)) {
		good = achieve[hs];
	} else {
		for(int m : masks) {
			if(vis[m << 1][0] != cur)
				dfs(m << 1, 0);
		}
		vi tmp = {};
		for(int i = 0; i < (1 << w); ++i) {
			if(vis[i << 1][w]==cur) {
				tmp.PB(i);
			}
		}
		achieve[hs] = tmp;
		good = tmp;
	}
	masks = {};
	for(int i : good) {
		if((i & ww) == ww) {
			masks.PB(i ^ ww);
		}
	}
}
int period[13] = {0, 3, 2, 3, 6, 6, 6, 3, 20, 3, 6, 6, 6};
void zeroes(int cnt) {
	int ile = 0;
	for(int i = 0; i < min(12, cnt); ++i) {
		rozwaz(0);
		ile++;
	}
	cnt -= ile;
	cnt %= period[w - 1];
	for(int i = 0; i < cnt; ++i) {
		rozwaz(0);
	}
}
mt19937 rng(19024910);
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> w >> h >> k;
	for(int i = 0; i < (1 << w); ++i) hsh[i] = rng() % 1000000000;
	for(int row = 0; row < w; ++row) {
		for(int mask = 0; mask < (1 << (w + 1)); ++mask) {
			if((mask & 1) == 0) g[mask][row].PB((mask >> 1) | (1 << w));
			int m = (mask >> 1);
			if(row < w - 1) {
				if((m&3)==3 && (mask & 1) == 0) {
					g[mask][row].PB(m^3);
				}
			}
			if(row > 0) {
				if((m&1) && (m & (1 << (w-1))) && (mask & 1) == 0) {
					m ^= 1;
					m ^= (1 << (w - 1));
					g[mask][row].PB(m);
					m ^= 1;
					m ^= (1 << (w - 1));
				}
			}
			if(row > 0) {
				if((mask & 3)==3) {
					g[mask][row].PB((mask^3) >> 1);
				}
			}
			if(row > 0) {
				if((mask & 1) && (mask & (1 << w))) {
					g[mask][row].PB((mask^1^(1<<w))>>1);
				}
			}
		}
	}
	for(int x, y, i = 0; i < k; ++i) {
		cin >> x >> y;
		state[y] += (1 << ((x - 1)));
	}
	masks = {0};
	int last = 0;
	for(auto it : state) {
		int cnt = it.ST - last - 1;
		zeroes(cnt);
		rozwaz(it.ND);
		last = it.ST;
	}
	int cnt = h - last;
	if(cnt > 0) zeroes(cnt);
	bool exist = false;
	for(int m : masks) if(!m) exist = true;
	if(!exist) cout << "NO";
	else cout << "YES";
	
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |