#include <bits/stdc++.h>
using namespace std;
#define FOR(i,p,q) for(int i=(p); i<=(q); ++i)
#define ROF(i,p,q) for(int i=(p); i>=(q); --i)
#define REP(i,q) for(int i=0; i<(q); ++i)
#define pb push_back
#define as assign
#define rz resize
#define Co const
#define all(X) X.begin(), X.end()
#define rall(X) X.rbegin(), X.rend()
#define sz(X) (int)(X.size())
#define ckmax(a,b) a=max(a,b)
#define ckmin(a,b) a=min(a,b)
#define V vector
typedef long long ll;
typedef mt19937_64 mt;
#ifndef UNCLE
typedef basic_string<bool> vb;
typedef basic_string<int> vi;
typedef basic_string<ll> vl;
#else
typedef V<bool> vb;
typedef V<int> vi;
typedef V<ll> vl;
#endif
int N, P,Q,ct=0;
vi s;
bool isG;
void Input(){
cin>>N;
s.rz(N);
P=Q=-2, isG=1;
REP(i,N){
cin>>s[i];
if(s[i]!=0){
if(Q==i-1||Q==-2) Q=i;
else isG=0;
if(P==-2) P=i;
}
}
}
void Solve(){
Input();
if(!isG){ cout<<"NIE\n"; return;}
if(P==Q){
if(s[P]==1) cout<<"TAK\n";
else cout<<"NIE\n";
return;
}
// if(N==2){
// }
int ck=s[P]*2, qtSp=0;
FOR(i,P+1,Q-1){
if(ck>2*s[i]+1){
cout<<"NIE\n"; return;
}
else if(ck==2*s[i]+1){//wsm nigdy nie bedzie takiej sytuacji, po parzystosc jest niezmiennia ->0
if(qtSp!=0){ cout<<"NIE\n"; return;}
qtSp=2, ck=1;
}
else if(ck==2*s[i]){//jakbym usunal to bym przegral, wiec spec act by minus jeden
if(qtSp==2){ cout<<"NIE\n"; return;}
++qtSp, ck=1;
}
else if(ck<s[i]) ck+=(s[i]-ck)*2;
else if(ck>s[i]) ck-=(ck-s[i])*2;
}
if(ck==2*s[Q]){ cout<<"TAK\n"; return;}
else{
if((ck==2*s[Q]-1||ck==2*s[Q]+1)&&qtSp!=2){ cout<<"TAK\n"; return;}
if((ck==2*s[Q]-2||ck==2*s[Q]+2)&&qtSp==0){ cout<<"TAK\n"; return;}
else{ cout<<"NIE\n"; return;}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T; cin>>T;
while(++ct<=T) Solve();
}
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 | #include <bits/stdc++.h> using namespace std; #define FOR(i,p,q) for(int i=(p); i<=(q); ++i) #define ROF(i,p,q) for(int i=(p); i>=(q); --i) #define REP(i,q) for(int i=0; i<(q); ++i) #define pb push_back #define as assign #define rz resize #define Co const #define all(X) X.begin(), X.end() #define rall(X) X.rbegin(), X.rend() #define sz(X) (int)(X.size()) #define ckmax(a,b) a=max(a,b) #define ckmin(a,b) a=min(a,b) #define V vector typedef long long ll; typedef mt19937_64 mt; #ifndef UNCLE typedef basic_string<bool> vb; typedef basic_string<int> vi; typedef basic_string<ll> vl; #else typedef V<bool> vb; typedef V<int> vi; typedef V<ll> vl; #endif int N, P,Q,ct=0; vi s; bool isG; void Input(){ cin>>N; s.rz(N); P=Q=-2, isG=1; REP(i,N){ cin>>s[i]; if(s[i]!=0){ if(Q==i-1||Q==-2) Q=i; else isG=0; if(P==-2) P=i; } } } void Solve(){ Input(); if(!isG){ cout<<"NIE\n"; return;} if(P==Q){ if(s[P]==1) cout<<"TAK\n"; else cout<<"NIE\n"; return; } // if(N==2){ // } int ck=s[P]*2, qtSp=0; FOR(i,P+1,Q-1){ if(ck>2*s[i]+1){ cout<<"NIE\n"; return; } else if(ck==2*s[i]+1){//wsm nigdy nie bedzie takiej sytuacji, po parzystosc jest niezmiennia ->0 if(qtSp!=0){ cout<<"NIE\n"; return;} qtSp=2, ck=1; } else if(ck==2*s[i]){//jakbym usunal to bym przegral, wiec spec act by minus jeden if(qtSp==2){ cout<<"NIE\n"; return;} ++qtSp, ck=1; } else if(ck<s[i]) ck+=(s[i]-ck)*2; else if(ck>s[i]) ck-=(ck-s[i])*2; } if(ck==2*s[Q]){ cout<<"TAK\n"; return;} else{ if((ck==2*s[Q]-1||ck==2*s[Q]+1)&&qtSp!=2){ cout<<"TAK\n"; return;} if((ck==2*s[Q]-2||ck==2*s[Q]+2)&&qtSp==0){ cout<<"TAK\n"; return;} else{ cout<<"NIE\n"; return;} } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); int T; cin>>T; while(++ct<=T) Solve(); } |
English