#include <iostream>
#include <list>
#include <set>
#include <unordered_map>
#include <stack>
struct Point {
unsigned long long n;
unsigned long long m;
bool operator==(const Point &other) const {
return (n == other.n && m == other.m);
}
};
int main()
{
unsigned long long n, m, fortsCount;
std::cin >> n;
std::cin >> m;
std::cin >> fortsCount;
unsigned long long currXor = 0;
bool** fortsPlaced = static_cast<bool **>(calloc(n, sizeof(bool *)));
for (int i = 0; i < n; i++) {
fortsPlaced[i] = static_cast<bool *>(calloc(m, sizeof(bool)));
}
for (unsigned long long f = 0; f < fortsCount; f++) {
unsigned long long r, c, z;
std::cin >> r;
std::cin >> c;
std::cin >> z;
unsigned long long currN = (r ^ currXor) % n;
unsigned long long currM = (c ^ currXor) % m;
fortsPlaced[currN][currM] = true;
bool** visited = static_cast<bool **>(calloc(n, sizeof(bool *)));
for (int i = 0; i < n; i++) {
visited[i] = static_cast<bool *>(calloc(m, sizeof(bool)));
}
std::stack<Point> stack;
stack.push(Point{0, 0});
Point p = {INT32_MAX, INT32_MAX};
while (!stack.empty() && !(p == Point{n-1, m-1})) {
p = stack.top();
stack.pop();
if (p.n < n-1 && !fortsPlaced[p.n+1][p.m]
&& !visited[p.n + 1][p.m]) {
visited[p.n + 1][p.m] = true;
stack.push(Point{p.n + 1, p.m});
}
if (p.m < m-1 && !fortsPlaced[p.n][p.m + 1]
&& !visited[p.n][p.m + 1]) {
visited[p.n][p.m + 1] = true;
stack.push(Point{p.n, p.m + 1});
}
}
if (!visited[n-1][m-1]) {
currXor ^= z;
fortsPlaced[currN][currM] = false;
std::cout << "TAK" << std::endl;
} else {
std::cout << "NIE" << std::endl;
}
for (int i = 0; i < n; i++) {
free(visited[i]);
}
free(visited);
}
for (int i = 0; i < n; i++) {
free(fortsPlaced[i]);
}
free(fortsPlaced);
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 | #include <iostream> #include <list> #include <set> #include <unordered_map> #include <stack> struct Point { unsigned long long n; unsigned long long m; bool operator==(const Point &other) const { return (n == other.n && m == other.m); } }; int main() { unsigned long long n, m, fortsCount; std::cin >> n; std::cin >> m; std::cin >> fortsCount; unsigned long long currXor = 0; bool** fortsPlaced = static_cast<bool **>(calloc(n, sizeof(bool *))); for (int i = 0; i < n; i++) { fortsPlaced[i] = static_cast<bool *>(calloc(m, sizeof(bool))); } for (unsigned long long f = 0; f < fortsCount; f++) { unsigned long long r, c, z; std::cin >> r; std::cin >> c; std::cin >> z; unsigned long long currN = (r ^ currXor) % n; unsigned long long currM = (c ^ currXor) % m; fortsPlaced[currN][currM] = true; bool** visited = static_cast<bool **>(calloc(n, sizeof(bool *))); for (int i = 0; i < n; i++) { visited[i] = static_cast<bool *>(calloc(m, sizeof(bool))); } std::stack<Point> stack; stack.push(Point{0, 0}); Point p = {INT32_MAX, INT32_MAX}; while (!stack.empty() && !(p == Point{n-1, m-1})) { p = stack.top(); stack.pop(); if (p.n < n-1 && !fortsPlaced[p.n+1][p.m] && !visited[p.n + 1][p.m]) { visited[p.n + 1][p.m] = true; stack.push(Point{p.n + 1, p.m}); } if (p.m < m-1 && !fortsPlaced[p.n][p.m + 1] && !visited[p.n][p.m + 1]) { visited[p.n][p.m + 1] = true; stack.push(Point{p.n, p.m + 1}); } } if (!visited[n-1][m-1]) { currXor ^= z; fortsPlaced[currN][currM] = false; std::cout << "TAK" << std::endl; } else { std::cout << "NIE" << std::endl; } for (int i = 0; i < n; i++) { free(visited[i]); } free(visited); } for (int i = 0; i < n; i++) { free(fortsPlaced[i]); } free(fortsPlaced); return 0; } |
English