把每张卡牌看成两个点,裸的线段树维护连通性。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define ls x*2,l,mid 6 #define rs x*2+1,mid+1,r 7 #define N 200005 8 using namespace std; 9 int read() 10 { 11 char c=getchar();int p=0; 12 while(c<'0'||c>'9')c=getchar(); 13 while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar(); 14 return p; 15 } 16 int n; 17 int aa[N][2]; 18 struct node 19 { 20 int v[2][2]; 21 }a[N*4]; 22 void push_up(int x,int mid) 23 { 24 int lc=x*2,rc=x*2+1; 25 a[x].v[0][0]=a[x].v[0][1]=a[x].v[1][0]=a[x].v[1][1]=0; 26 if(aa[mid][0]<=aa[mid+1][0]) 27 { 28 a[x].v[0][0]|=(a[lc].v[0][0]&a[rc].v[0][0]); 29 a[x].v[0][1]|=(a[lc].v[0][0]&a[rc].v[0][1]); 30 a[x].v[1][0]|=(a[lc].v[1][0]&a[rc].v[0][0]); 31 a[x].v[1][1]|=(a[lc].v[1][0]&a[rc].v[0][1]); 32 } 33 else if(aa[mid][0]<=aa[mid+1][1]) 34 { 35 a[x].v[0][0]|=(a[lc].v[0][0]&a[rc].v[1][0]); 36 a[x].v[0][1]|=(a[lc].v[0][0]&a[rc].v[1][1]); 37 a[x].v[1][0]|=(a[lc].v[1][0]&a[rc].v[1][0]); 38 a[x].v[1][1]|=(a[lc].v[1][0]&a[rc].v[1][1]); 39 } 40 if(aa[mid][1]<=aa[mid+1][0]) 41 { 42 a[x].v[0][0]|=(a[lc].v[0][1]&a[rc].v[0][0]); 43 a[x].v[0][1]|=(a[lc].v[0][1]&a[rc].v[0][1]); 44 a[x].v[1][0]|=(a[lc].v[1][1]&a[rc].v[0][0]); 45 a[x].v[1][1]|=(a[lc].v[1][1]&a[rc].v[0][1]); 46 } 47 else if(aa[mid][1]<=aa[mid+1][1]) 48 { 49 a[x].v[0][0]|=(a[lc].v[0][1]&a[rc].v[1][0]); 50 a[x].v[0][1]|=(a[lc].v[0][1]&a[rc].v[1][1]); 51 a[x].v[1][0]|=(a[lc].v[1][1]&a[rc].v[1][0]); 52 a[x].v[1][1]|=(a[lc].v[1][1]&a[rc].v[1][1]); 53 } 54 return ; 55 } 56 void build(int x,int l,int r) 57 { 58 if(l==r) 59 { 60 a[x].v[0][1]=1; 61 a[x].v[0][0]=a[x].v[1][1]=1; 62 return ; 63 } 64 int mid=(l+r)>>1; 65 build(ls);build(rs); 66 push_up(x,mid); 67 } 68 void gai(int x,int l,int r,int pos) 69 { 70 if(l==r)return ; 71 int mid=(l+r)>>1; 72 if(pos<=mid)gai(ls,pos); 73 else gai(rs,pos); 74 push_up(x,mid); 75 } 76 int main() 77 { 78 scanf("%d",&n); 79 for(int i=1;i<=n;i++) 80 { 81 aa[i][0]=read(),aa[i][1]=read(); 82 if(aa[i][0]>aa[i][1])swap(aa[i][0],aa[i][1]); 83 } 84 build(1,1,n); 85 int m; 86 scanf("%d",&m);int t1,t2; 87 for(int i=1;i<=m;i++) 88 { 89 t1=read();t2=read(); 90 swap(aa[t1][0],aa[t2][0]); 91 swap(aa[t1][1],aa[t2][1]); 92 gai(1,1,n,t1);gai(1,1,n,t2); 93 if(a[1].v[1][1]||a[1].v[1][0]||a[1].v[0][0]||a[1].v[0][1]) 94 { 95 puts("TAK"); 96 } 97 else puts("NIE"); 98 } 99 return 0; 100 }