#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
constexpr ll base=(1<<20);
vector<pair<ll, ll>> tree(2*base, make_pair(LLONG_MAX, 0));
void update(ll x, ll val) {
x+=base;
tree[x].first = val;
tree[x].second = x-base;
x/=2;
while(x>0) {
tree[x] = min(tree[2*x], tree[2*x+1]);
x/=2;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll t;
cin >> t;
while(t--) {
ll n;
cin >> n;
vector<ll> v(n);
for(ll i=0; i<n; ++i) cin >> v[i];
tree.assign(2*base, make_pair(LLONG_MAX, 0));
vector<ll> pos;
for(int i=0; i<n; ++i) if(v[i]) pos.push_back(i);
bool odp = 1;
for(int i=0; i<pos.size()-1; ++i) {
if(pos[i]+1 != pos[i+1]) {
cout << "NIE\n";
odp = 0;
break;
}
}
if(!odp) continue;
for(int i=0; i<pos.size(); ++i) {
update(i, v[pos[i]]);
}
n = pos.size();
ll l = 0;
ll r = n-1;
for(int i=0; i<n; ++i) {
auto[value, p] = tree[1];
if(value > i+1) {
cout << "NIE\n";
odp = 0;
break;
}
if(p==l) l++;
else if(p==r) r--;
else {
cout << "NIE\n";
odp = 0;
break;
}
update(p, LONG_MAX);
}
if(odp) cout << "TAK\n";
}
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 | #include <bits/stdc++.h> typedef long long ll; using namespace std; constexpr ll base=(1<<20); vector<pair<ll, ll>> tree(2*base, make_pair(LLONG_MAX, 0)); void update(ll x, ll val) { x+=base; tree[x].first = val; tree[x].second = x-base; x/=2; while(x>0) { tree[x] = min(tree[2*x], tree[2*x+1]); x/=2; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll t; cin >> t; while(t--) { ll n; cin >> n; vector<ll> v(n); for(ll i=0; i<n; ++i) cin >> v[i]; tree.assign(2*base, make_pair(LLONG_MAX, 0)); vector<ll> pos; for(int i=0; i<n; ++i) if(v[i]) pos.push_back(i); bool odp = 1; for(int i=0; i<pos.size()-1; ++i) { if(pos[i]+1 != pos[i+1]) { cout << "NIE\n"; odp = 0; break; } } if(!odp) continue; for(int i=0; i<pos.size(); ++i) { update(i, v[pos[i]]); } n = pos.size(); ll l = 0; ll r = n-1; for(int i=0; i<n; ++i) { auto[value, p] = tree[1]; if(value > i+1) { cout << "NIE\n"; odp = 0; break; } if(p==l) l++; else if(p==r) r--; else { cout << "NIE\n"; odp = 0; break; } update(p, LONG_MAX); } if(odp) cout << "TAK\n"; } return 0; } |
English