rt,没过样例,调不出来了 /kk
#define ls id << 1
#define rs id << 1 | 1
#define Mid int mid = (l + r) >> 1
const int N = 2e5 + 5;
int n, m, x[2][N];
int Tree[2][2][N << 2];
void pushup(int id, int mid) {
Tree[1][1][id] = Tree[0][0][id] = Tree[0][1][id] = Tree[1][0][id] = 0;
rep(i, 0, 1) {
rep(j, 0, 1) {
if(x[0][mid] <= x[0][mid + 1]) Tree[i][j][id] |= (Tree[i][0][ls] & Tree[0][j][rs]);
if(x[1][mid] <= x[0][mid + 1]) Tree[i][j][id] |= (Tree[i][1][ls] & Tree[0][j][rs]);
if(x[0][mid] <= x[1][mid + 1]) Tree[i][j][id] |= (Tree[i][0][ls] & Tree[1][j][rs]);
if(x[1][mid] <= x[1][mid + 1]) Tree[i][j][id] |= (Tree[i][1][ls] & Tree[1][j][rs]);
}
}
}
void build(int id, int l, int r) {
if(l == r) {
Tree[1][1][id] = Tree[0][0][id] = 1;
return ;
}
Mid;
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(id, mid);
}
void update(int id, int l, int r, int ch, int v, int vv) {
if(l == r) {
x[0][l] = v, x[1][l] = vv;
return ;
}
Mid;
if(mid >= ch) update(ls, l, mid, ch, v, vv);
else update(rs, mid + 1, r, ch, v, vv);
pushup(id, mid);
}
int main() {
qread(n);
rep(i, 1, n) qread(x[0][i], x[1][i]);
qread(m);
build(1, 1, n);
W(m) {
int k, y;
qread(k, y);
update(1, 1, n, k, x[0][y], x[1][y]);
update(1, 1, n, y, x[0][k], x[1][k]);
if(Tree[1][1][1] || Tree[0][0][1] || Tree[1][0][1] || Tree[0][1][1]) puts("TAK");
else puts("NIE");
}
return 0;
}