#include <bits/stdc++.h> #define FOR(i, a, b) for (int i=(a); i<(b); i++) #define PPC(x) __builtin_popcountll((x)) #define ALL(x) (x).begin(), (x).end() #define pb push_back #define st first #define nd second using namespace std; const int maxN = 1 << 18, maxA = 1 << 20; long long prod[maxN], ile[maxA]; int End[maxN]; bool pres[maxA]; vector <int> kto, Plus, Minus; void clear() { for (int a : kto) ile[a] = 0ll, pres[a] = false; kto.resize(0); Minus.resize(0); Plus.resize(0); } inline long long align(long long& a, long long& b) { long long c = min(a, b); a -= c; b -= c; return c; } bool solve() { clear(); int n; scanf ("%d", &n); while (n--) { int l, a, b; scanf ("%d%d%d", &l, &a, &b); for (int c : {a, b}) if (!pres[c]) kto.pb(c), pres[c] = true; ile[a] += l; ile[b] -= l; } for (int a : kto) { if (ile[a] > 0ll) Plus.pb(a); if (ile[a] < 0ll) Minus.pb(a), ile[a] *= -1ll; } sort(ALL(Plus)); sort(ALL(Minus)); int qb = 0, qe = 0, ip = 0, im = 0; while (ip < Plus.size()) { assert(im < Minus.size()); int a = Plus[ip], b = Minus[im]; long long p = align(ile[a], ile[b]) * abs(b - a); if (ile[a] == 0ll) ip++; if (ile[b] == 0ll) im++; if (a < b) { prod[qe] = p; End[qe++] = b; } else while (p != 0ll) { if (qe == qb or End[qb] > b) return false; align(p, prod[qb]); if (prod[qb] == 0ll) qb++; } } return qe == qb; } int main() { int t; scanf ("%d", &t); while (t--) printf("%s\n", solve() ? "TAK" : "NIE"); 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 93 94 95 | #include <bits/stdc++.h> #define FOR(i, a, b) for (int i=(a); i<(b); i++) #define PPC(x) __builtin_popcountll((x)) #define ALL(x) (x).begin(), (x).end() #define pb push_back #define st first #define nd second using namespace std; const int maxN = 1 << 18, maxA = 1 << 20; long long prod[maxN], ile[maxA]; int End[maxN]; bool pres[maxA]; vector <int> kto, Plus, Minus; void clear() { for (int a : kto) ile[a] = 0ll, pres[a] = false; kto.resize(0); Minus.resize(0); Plus.resize(0); } inline long long align(long long& a, long long& b) { long long c = min(a, b); a -= c; b -= c; return c; } bool solve() { clear(); int n; scanf ("%d", &n); while (n--) { int l, a, b; scanf ("%d%d%d", &l, &a, &b); for (int c : {a, b}) if (!pres[c]) kto.pb(c), pres[c] = true; ile[a] += l; ile[b] -= l; } for (int a : kto) { if (ile[a] > 0ll) Plus.pb(a); if (ile[a] < 0ll) Minus.pb(a), ile[a] *= -1ll; } sort(ALL(Plus)); sort(ALL(Minus)); int qb = 0, qe = 0, ip = 0, im = 0; while (ip < Plus.size()) { assert(im < Minus.size()); int a = Plus[ip], b = Minus[im]; long long p = align(ile[a], ile[b]) * abs(b - a); if (ile[a] == 0ll) ip++; if (ile[b] == 0ll) im++; if (a < b) { prod[qe] = p; End[qe++] = b; } else while (p != 0ll) { if (qe == qb or End[qb] > b) return false; align(p, prod[qb]); if (prod[qb] == 0ll) qb++; } } return qe == qb; } int main() { int t; scanf ("%d", &t); while (t--) printf("%s\n", solve() ? "TAK" : "NIE"); return 0; } |