int n, tot = 1; int trie[kMaxT][2]; bool vis[kMaxT]; std::array<int, 60> rt; std::map<std::array<int, 60>, bool> f;
voidinit(){ f.clear(); for (int i = 1; i <= tot; ++i) trie[i][0] = trie[i][1] = vis[i] = 0; tot = 0; for (int i = 0; i < 60; ++i) { rt[i] = ++tot; int lst = tot; for (int j = 0; j < i; ++j) { trie[lst][0] = trie[lst][1] = ++tot; lst = tot; } } }
voidins(int cur, int x){ assert(cur); vis[cur] = 1; for (int i = 0; i < 60; ++i) { int k = (x >> i & 1); if (!trie[cur][k]) trie[cur][k] = ++tot; vis[cur = trie[cur][k]] = 1; } }
voidupdate(int l, int r, int ql, int qr){ if (l > qr || r < ql) return; elseif (l >= ql && r <= qr) returnins(rt[__builtin_ctzll(r - l + 1)], l); int mid = (l + r) >> 1; update(l, mid, ql, qr), update(mid + 1, r, ql, qr); }
boolsolve(std::array<int, 60> a){ if (f.count(a)) return f[a]; bool fl = 0; for (int i = 0; i < 60; ++i) fl |= vis[a[i]]; if (!fl) return0; bool res = 1; for (int o = 0; o < 2; ++o) { auto b = a; for (auto &x : b) x = trie[x][o]; res &= solve(b); if (!res) break; } return f[a] = (res ^ 1); }
voiddickdreamer(){ std::cin >> n; init(); for (int i = 1; i <= n; ++i) { int l, r; std::cin >> l >> r; update(0, (1ll << 60) - 1, l, r); } std::cout << (solve(rt) ? "Takahashi\n" : "Aoki\n"); }