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 <cstdio> #include <algorithm> #define inf 0x3fffffff #define gc (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 131072, stdin), p1 == p2) ? EOF : *p1 ++)
char buf[131072], *p1, *p2; inline int read() { char ch; int x(0); while ((ch = gc) < 48); while (ch >= 48) x = x * 10 + ch - 48, ch = gc; return x; }
struct Pair { int x, y; } card[200005];
struct Segment_tree { struct node { int l, r, v1, v2; } a[800005];
inline void Solve(int O) { int mid(a[O << 1].r + 1); if (a[O << 1].v1 <= card[mid].y) { if (a[O << 1].v1 <= card[mid].x) a[O].v1 = a[O << 1 | 1].v1; else a[O].v1 = a[O << 1 | 1].v2; if (a[O << 1].v2 <= card[mid].y) { if (a[O << 1].v2 <= card[mid].x) a[O].v2 = a[O << 1 | 1].v1; else a[O].v2 = a[O << 1 | 1].v2; } else a[O].v2 = inf; } else a[O].v1 = a[O].v2 = inf; }
void make_tree(int O, int L, int R) { a[O].l = L, a[O].r = R; int mid(L + R >> 1); if (L != R) make_tree(O << 1, L, mid), make_tree(O << 1 | 1, mid + 1, R), Solve(O); else a[O].v1 = card[L].x, a[O].v2 = card[L].y; }
void update(int O, int p) { if (a[O].l == a[O].r) {a[O].v1 = card[a[O].l].x, a[O].v2 = card[a[O].l].y; return;} if (a[O << 1].r >= p) update(O << 1, p); else update(O << 1 | 1, p); Solve(O); } } Tree;
int main() { int n(read()), m; for (int i(1); i <= n; ++ i) { card[i].x = read(), card[i].y = read(); if (card[i].x > card[i].y) std::swap(card[i].x, card[i].y); } Tree.make_tree(1, 1, n); m = read(); while (~-- m) { int c(read()), d(read()); std::swap(card[c], card[d]); Tree.update(1, c), Tree.update(1, d); if (Tree.a[1].v1 <= 1e9) puts("TAK"); else puts("NIE"); } }
|