#include <bits/stdc++.h> #define fi first #define sc second #define pb push_back #define rep(i,p,k) for(int i=(p);i<(k);++i) #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define forr(i,k,p) for(int i=(k)-1;i>=(p);--i) #define each(a,b) for(auto&a:b) #define all(v) begin(v), end(v) #define RET(smth) return void(cout<<(smth)<<'\n') #define sz(v) (int)v.size() using namespace std; using pii = pair<int,int>; using ll = long long; using lll = __int128_t; using Vi = vector<int>; #ifdef DEBUG #include "debug.h" #else #define debug(...) ; #endif struct MAIN { void TEST() { int n; cin >> n; vector<ll> t(n); for(auto&v:t) cin >> v; while(t.back() == 0) t.pop_back(); reverse(all(t)); while(t.back() == 0) t.pop_back(); reverse(all(t)); if(find(all(t),0) != t.end()) RET("NIE"); if(sz(t) == 1) { if(t[0] == 1) RET("TAK"); else RET("NIE"); } n = sz(t); vector<ll> d(n); auto check = [&] { d[0] = t[0]; rep(i,1,n) d[i] = t[i] - d[i-1]; rep(i,0,n-1) if(d[i] <= 0) return false; return d[n-1] == 0; }; if(check()) RET("TAK"); debug(d); rep(i,0,n-1) if(d[i] < 0) RET("NIE"); if(d[n-1] < -1 || d[n-1] > 1) RET("NIE"); bool ok[] = {true, true}; rep(i,0,n-1) if(d[i] == 0) ok[i % 2] = false; if(!ok[0] && !ok[1]) RET("NIE"); int fst = -1; rep(i,0,n-1) if(d[i] == 0) { fst = i; break; } debug(fst); if(fst == -1) { // d[n-1] == -1 | 1 if(d[n-1] == -1 && t[n-2] == 1) RET("NIE"); t[n-2] -= 1; if(check()) RET("TAK"); t[n-2] += 1; t[n-1] -= 1; if(check()) RET("TAK"); t[n-1] += 1; } if(fst != -1 && t[fst-1] > 1) { t[fst-1]--; if(check()) RET("TAK"); t[fst-1]++; } rep(i,max(1,fst),n-2) t[i]++; if(check()) RET("TAK"); t[n-2]++; if(check()) RET("TAK"); t[n-1]++; if(check()) RET("TAK"); RET("NIE"); } }; int main() { #ifndef DEBUG cin.tie(0) -> sync_with_stdio(0); #endif int Z = 1; cin>>Z; while(Z--) MAIN{}.TEST(); 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 | #include <bits/stdc++.h> #define fi first #define sc second #define pb push_back #define rep(i,p,k) for(int i=(p);i<(k);++i) #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define forr(i,k,p) for(int i=(k)-1;i>=(p);--i) #define each(a,b) for(auto&a:b) #define all(v) begin(v), end(v) #define RET(smth) return void(cout<<(smth)<<'\n') #define sz(v) (int)v.size() using namespace std; using pii = pair<int,int>; using ll = long long; using lll = __int128_t; using Vi = vector<int>; #ifdef DEBUG #include "debug.h" #else #define debug(...) ; #endif struct MAIN { void TEST() { int n; cin >> n; vector<ll> t(n); for(auto&v:t) cin >> v; while(t.back() == 0) t.pop_back(); reverse(all(t)); while(t.back() == 0) t.pop_back(); reverse(all(t)); if(find(all(t),0) != t.end()) RET("NIE"); if(sz(t) == 1) { if(t[0] == 1) RET("TAK"); else RET("NIE"); } n = sz(t); vector<ll> d(n); auto check = [&] { d[0] = t[0]; rep(i,1,n) d[i] = t[i] - d[i-1]; rep(i,0,n-1) if(d[i] <= 0) return false; return d[n-1] == 0; }; if(check()) RET("TAK"); debug(d); rep(i,0,n-1) if(d[i] < 0) RET("NIE"); if(d[n-1] < -1 || d[n-1] > 1) RET("NIE"); bool ok[] = {true, true}; rep(i,0,n-1) if(d[i] == 0) ok[i % 2] = false; if(!ok[0] && !ok[1]) RET("NIE"); int fst = -1; rep(i,0,n-1) if(d[i] == 0) { fst = i; break; } debug(fst); if(fst == -1) { // d[n-1] == -1 | 1 if(d[n-1] == -1 && t[n-2] == 1) RET("NIE"); t[n-2] -= 1; if(check()) RET("TAK"); t[n-2] += 1; t[n-1] -= 1; if(check()) RET("TAK"); t[n-1] += 1; } if(fst != -1 && t[fst-1] > 1) { t[fst-1]--; if(check()) RET("TAK"); t[fst-1]++; } rep(i,max(1,fst),n-2) t[i]++; if(check()) RET("TAK"); t[n-2]++; if(check()) RET("TAK"); t[n-1]++; if(check()) RET("TAK"); RET("NIE"); } }; int main() { #ifndef DEBUG cin.tie(0) -> sync_with_stdio(0); #endif int Z = 1; cin>>Z; while(Z--) MAIN{}.TEST(); return 0; } |