第一次发没人回,所以再发了一次。
#include<bits/stdc++.h>
using namespace std;
struct LSnode {
int x,p,z;
}A[2000010],B[2000010];
int par[1000010],C[1000010];
bool cmp(LSnode x,LSnode y) {
return x.x<y.x;
}
int find(int k) {
if(k==par[k]) return k;
return par[k]=find(par[k]);
}
void combine(int x,int y) {
par[find(x)]=find(y);
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
int x,y,z;
scanf("%d%d%d",&A[i*2-1].x,&A[i*2].x,&C[i]);
A[i*2-1].p=i*2-1;A[i*2].p=i*2;
B[i*2-1]=A[i*2-1];B[i*2]=A[i*2];
}
sort(A+1,A+1+2*n,cmp);
A[1].z=1;
for(int i=2;i<=2*n;i++) {
if(A[i-1].x==A[i].x) A[i].z=A[i-1].z;
else A[i].z=A[i-1].z+1;
}
for(int i=1;i<=2*n;i++) B[A[i].p].z=A[i].z;
for(int i=1;i<=A[2*n].z*2+1;i++) par[i]=i;
for(int i=1;i<=n;i++) {
int x=B[i*2-1].z,y=B[i*2].z;
if(C[i]==1) {
combine(x,y);
combine(x+A[2*n].z,y+A[2*n].z);
}
else {
combine(x+A[2*n].z,y);
combine(x,y+A[2*n].z);
}
}
bool bj=0;
for(int i=1;i<=A[n*2].z;i++) {
if(find(i)==find(i+A[2*n].z)) {
printf("NO\n");
bj=1;
break;
}
}
if(!bj) printf("YES\n");
}
return 0;
}