#include using namespace std; //#define int long long #define rep(i, a, b) for (int i = a; i < (b); ++i) #define f(i,a,b) for(int i = (a); i < (b); ++i) using ll = long long; typedef vector vi; struct TwoSat { int N; vector gr; vi values; TwoSat(int n = 0) : N(n), gr(2 * n) {} void either(int f, int j) { f = max(2 * f, - 1 - 2 * f); j = max(2 * j, - 1 - 2 * j); gr[f].push_back(j ^ 1); gr[j].push_back(f ^ 1); } vi val, comp, z; int time = 0; int dfs(int i) { int low = val[i] = ++time, x; z.push_back(i); for (int e : gr[i]) { if (!comp[e]) { low = min(low, val[e] ?: dfs(e)); } } if (low == val[i]) { do { x = z.back(); z.pop_back(); comp[x] = low; if (values[x >> 1] == -1) { values[x >> 1] = x & 1; } } while (x != i); } return val[i] = low; } bool solve() { values.assign(N, -1); val.assign(2 * N, 0); comp = val; rep(i, 0, 2 * N) if (!comp[i]) dfs(i); rep(i, 0, N) if (comp[2 * i] == comp[2 * i + 1]) return 0; return 1; } void setValue(int x) { either(x, x); } }; struct Dock { bool dir;//0 - vert, 1 - hor int x, y, len; }; signed main() { cin.tie(0)->sync_with_stdio(0); int h, w, n; cin >> h >> w >> n; array, bool>, 501>, 501> table; vector docks(n); for (int i = 0; i < n; ++i) { cin >> docks[i].x >> docks[i].y >> docks[i].len; char dir; cin >> dir; if (dir == 'L') { dir = 'R'; docks[i].y -= docks[i].len - 1; } if (dir == 'U') { dir = 'D'; docks[i].x -= docks[i].len - 1; } if (dir == 'R') docks[i].dir = 1; else docks[i].dir = 0; if (docks[i].dir == 0) { //vertical, going down table[docks[i].x][docks[i].y].first.emplace_back(i); for (int j = docks[i].x + 1; j + 1 < docks[i].x + docks[i].len; ++j) { if (table[j][docks[i].y].second) { cout << "No\n"; return 0; } table[j][docks[i].y].second = true; } table[docks[i].x + docks[i].len - 1][docks[i].y].first.emplace_back(~i); } if (docks[i].dir == 1) { //horizontal, going right table[docks[i].x][docks[i].y].first.emplace_back(i); for (int j = docks[i].y + 1; j + 1 < docks[i].y + docks[i].len; ++j) { if (table[docks[i].x][j].second) { cout << "No\n"; return 0; } table[docks[i].x][j].second = true; } table[docks[i].x][docks[i].y + docks[i].len - 1].first.emplace_back(~i); } } TwoSat sat(n); for (int i = 1; i <= h; ++i) { for (int j = 1; j <= w; ++j) { if (table[i][j].first.size() > 8) { cout << "No\n"; return 0; } if (table[i][j].second) { for (auto k : table[i][j].first) sat.setValue(~k); } else { for (int k = 0; k < table[i][j].first.size(); ++k) { for (int l = k + 1; l < table[i][j].first.size(); ++l) { sat.either(table[i][j].first[k], table[i][j].first[l]); sat.either(~table[i][j].first[k], ~table[i][j].first[l]); } } } } } if (sat.solve()) cout << "Yes\n"; else cout << "No\n"; return 0; }