RT,Hack 全过。大家都是 WA #7,感觉 WA #9 非常奇葩。
#include <bits/stdc++.h>
#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair <ll, ll>
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
const ll N = 2e6 + 7, M = 1e3 + 5;
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;
ll n;
ll p[N], d[N], v[N];
ll s[N], t[N];
bool f[N];
// i -> i : all
void pushup(ll k) { t[k] = min(t[k << 1], t[k << 1 | 1]); }
void build(ll k, ll l, ll r)
{
if (l == r) { t[k] = s[l]; return ; }
ll mid = l + r >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
pushup(k);
}
ll Q(ll k, ll l, ll r, ll ql, ll qr)
{
// cout << "query " << l << ' ' << r << ' ' << ql << ' ' << qr << '\n';
if (ql <= l && r <= qr) return t[k];
ll mid = l + r >> 1, cc = 1e18;
if (ql <= mid) cc = min(cc, Q(k << 1, l, mid, ql, qr));
if (qr > mid) cc = min(cc, Q(k << 1 | 1, mid + 1, r, ql, qr));
return cc;
}
// 2 -1 3 -1 1
/*
3
1 2
2 1
1 1
3
1 100
10000 500
298 200
*/
// -1 1 0
// 5 4 3 2 1 5 4 3 2 1
ll lst(ll x)
{
if (x == 1) return n;
return x - 1;
}
signed main()
{
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
FstIO;
cin >> n;
for (ll i = 1; i <= n; ++ i ) cin >> p[i] >> d[i];
for (ll i = 0; i <= (n << 2); ++ i ) t[i] = 1e18;
for (ll i = 1; i <= (n << 1); ++ i )
{
if (i <= n) v[i] = p[i] - d[i];
else v[i] = p[i - n] - d[i - n];
s[i] = s[i - 1] + v[i];
}
// for (ll i = 1; i <= (n << 1); ++ i ) cout << s[i] << ' '; cout << '\n';
build(1, 1, (n << 1));
for (ll i = 1; i <= n; ++ i )
{
ll v = Q(1, 1, (n << 1), i, i + n - 1);
// cout << v << ' ' << s[i - 1] << ' ';
if (v - s[i - 1] >= 0) f[i] = true;
else f[i] = false;
// cout << i << ' ' << f[i] << '\n';
}
for (ll i = 0; i <= (n << 2); ++ i ) t[i] = 1e18;
for (ll i = 0; i <= (n << 1); ++ i ) s[i] = 0;
for (ll i = 1; i <= n; ++ i )
{
v[i] = p[i] - d[lst(i)];
}
for (ll i = n + 1; i <= (n << 1); ++ i ) v[i] = p[i - n] - d[lst(i - n)];
// s[1] = p[n];
for (ll i = 1; i <= n; ++ i )
{
ll q = n - i + 1;
s[i] = s[i - 1] + v[q];
}
for (ll i = n + 1; i <= (n << 1); ++ i )
{
ll q = i - n; q = n - q + 1;
s[i] = s[i - 1] + v[q];
}
build(1, 1, (n << 1));
// for (ll i = 1; i <= (n << 1); ++ i ) cout << v[i] << ' '; cout << '\n';
// for (ll i = 1; i <= (n << 1); ++ i ) cout << s[i] << ' '; cout << '\n';
// for (ll i = 1; i <= (n << 1); ++ i ) cout << t[i] << ' '; cout << '\n';
for (ll i = 1; i <= n; ++ i )
{
if (f[n - i + 1]) continue;
ll v = Q(1, 1, (n << 1), i, i + n - 1);
// cout << n - i + 1 << ' ' << i << ' ' << i + n - 1 << ' ' << v << ' ' << s[i - 1] << '\n';
// cout << "deb \n";
// for (ll j = i; j <= i + n - 1; ++ j ) cout << s[j] << ' '; cout << '\n';
if (v - s[i - 1] >= 0) f[n - i + 1] = true;
}
for (ll i = 1; i <= n; ++ i ) cout << (f[i] ? "TAK\n" : "NIE\n");
return 0;
cout.flush();
}