#include <bits/stdc++.h> #ifdef LOC #include "debuglib.h" #else #define deb(...) #define DBP(...) #endif using namespace std; using ll = long long; using Vi = vector<int>; using Pii = pair<int, int>; #define pb push_back #define mp make_pair #define x first #define y second #define rep(i, b, e) for (int i = (b); i < (e); i++) #define each(a, x) for (auto& a : (x)) #define all(x) (x).begin(), (x).end() #define sz(x) int((x).size()) struct Board { int wid, hei; vector<set<int>> rows, cols; set<Pii> down; void init(int w, int h) { wid = w; hei = h; rows.resize(h+2); cols.resize(w+2); down.insert({0, 1}); down.insert({w, h+1}); } bool touch(int x, int y) { auto it = down.lower_bound({x, -1}); //assert(it != down.begin() && it != down.end()); if (y+1 >= it->y) return y+1 == it->y; auto prv = prev(it); return prv->x == x-1 && y+1 >= prv->y; } void check(int x, int y) { if (!touch(x, y)) return; auto it = down.insert({x, y}).x; while (1) { auto prv = prev(it); if (prv->y < it->y) break; down.erase(prv); } while (1) { auto nxt = next(it); if (nxt->x > it->x) break; down.erase(nxt); } auto c1 = rows[y-1].upper_bound(x+1); if (c1 != rows[y-1].begin()) check(*prev(c1), y-1); auto c2 = cols[x+1].lower_bound(y-1); if (c2 != cols[x+1].end()) check(x+1, *c2); } void add(int x, int y) { rows[y].insert(x); cols[x].insert(y); check(x, y); } }; int n, m, k; Board normal, flipped; bool add(int x, int y) { if (normal.touch(x, y) && flipped.touch(y, x)) { return 1; } normal.add(x, y); flipped.add(y, x); return 0; } int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(18); cin >> n >> m >> k; normal.init(m, n); flipped.init(n, m); int x = 0; rep(i, 0, k) { int r, c, z; cin >> r >> c >> z; r = (r ^ x) % n; c = (c ^ x) % m; bool ans = add(c+1, r+1); if (ans) x ^= z; cout << (ans ? "TAK\n": "NIE\n"); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <bits/stdc++.h> #ifdef LOC #include "debuglib.h" #else #define deb(...) #define DBP(...) #endif using namespace std; using ll = long long; using Vi = vector<int>; using Pii = pair<int, int>; #define pb push_back #define mp make_pair #define x first #define y second #define rep(i, b, e) for (int i = (b); i < (e); i++) #define each(a, x) for (auto& a : (x)) #define all(x) (x).begin(), (x).end() #define sz(x) int((x).size()) struct Board { int wid, hei; vector<set<int>> rows, cols; set<Pii> down; void init(int w, int h) { wid = w; hei = h; rows.resize(h+2); cols.resize(w+2); down.insert({0, 1}); down.insert({w, h+1}); } bool touch(int x, int y) { auto it = down.lower_bound({x, -1}); //assert(it != down.begin() && it != down.end()); if (y+1 >= it->y) return y+1 == it->y; auto prv = prev(it); return prv->x == x-1 && y+1 >= prv->y; } void check(int x, int y) { if (!touch(x, y)) return; auto it = down.insert({x, y}).x; while (1) { auto prv = prev(it); if (prv->y < it->y) break; down.erase(prv); } while (1) { auto nxt = next(it); if (nxt->x > it->x) break; down.erase(nxt); } auto c1 = rows[y-1].upper_bound(x+1); if (c1 != rows[y-1].begin()) check(*prev(c1), y-1); auto c2 = cols[x+1].lower_bound(y-1); if (c2 != cols[x+1].end()) check(x+1, *c2); } void add(int x, int y) { rows[y].insert(x); cols[x].insert(y); check(x, y); } }; int n, m, k; Board normal, flipped; bool add(int x, int y) { if (normal.touch(x, y) && flipped.touch(y, x)) { return 1; } normal.add(x, y); flipped.add(y, x); return 0; } int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(18); cin >> n >> m >> k; normal.init(m, n); flipped.init(n, m); int x = 0; rep(i, 0, k) { int r, c, z; cin >> r >> c >> z; r = (r ^ x) % n; c = (c ^ x) % m; bool ans = add(c+1, r+1); if (ans) x ^= z; cout << (ans ? "TAK\n": "NIE\n"); } return 0; } |