https://atcoder.jp/contests/abc255/tasks/abc255_g
// compile: g++ -o data data.cpp -O3 -std=gnu++20 -Wall -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -ggdb3 -fmax-errors=2 -DLOCAL // run: ./data < data.in #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #ifdef LOCAL #include <debug/codeforces.h> #define debug(x...) {_variables(#x);_print(x);} #else #define debug(x...) #endif template<typename...Args> void print_(Args...args){((cout<<args<<" "),...)<<endl;} #define rep(i,a,b) for(int i=(a);i<(int)(b);++i) #define sz(v) ((int)(v).size()) #define print(...) print_(__VA_ARGS__); #define INTMAX (int)(9223372036854775807) #define INTINF (int)(1152921504606846976) #define int long long #define MAXN 200010 int n, m; vector<int> a; struct node { int s, minus, g; vector<int> ban; }; vector<node> f; map<int, int> cnt; int binary_search(vector<node> &a, int l, int r, int x) { int ans = -1; while (l <= r) { int mid = l + (r-l) / 2; if (a[mid].s > x) r = mid - 1; else ans = mid, l = mid + 1; } return ans; } int sg(int x) { int ind = binary_search(f, 0, sz(f)-1, x); if (!~ind) return x; if (f[ind].s == x) return f[ind].g; return x - f[ind].minus; } void init() { int num = 0, maxsg = f[0].s - 1; rep(i, 0, sz(f)) { int minv = INTINF; map<int, int> v; for (auto j: f[i].ban) { int t = sg(f[i].s - j); ++v[t]; } for (auto [key, value]: v) { if (cnt[key] + 1 == value) { minv = key; break; } } if (minv != INTINF) { ++cnt[minv]; f[i].g = minv; f[i].minus = ++num; } else { f[i].g = ++maxsg; f[i].minus = num; } if (i+1 < sz(f) && f[i+1].s > f[i].s+1) maxsg = max(maxsg, f[i+1].s - f[i].minus - 1); } } int32_t main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> m; a.resize(n); rep(i, 0, n) cin >> a[i]; vector<pair<int, int>> t(m); rep(i, 0, m) cin >> t[i].first >> t[i].second; sort(t.begin(), t.end()); f.push_back({t[0].first, 0, 0, {t[0].second}}); rep(i, 1, m) { if (t[i].first != t[i-1].first) f.push_back({t[i].first, 0, 0, {}}); f.rbegin()->ban.push_back(t[i].second); } init(); int ans = 0; rep(i, 0, n) ans ^= sg(a[i]); cout << (ans ? "Takahashi" : "Aoki") << endl; return 0; }