RT
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAXN 1000000
using namespace std;
int l[MAXN * 2 + 10], fa[MAXN * 2 + 10], len;
bool e[MAXN + 10];
struct node{
int a, b, e;
}T[MAXN + 10];
bool cmp(node x, node y) {
return x.e > y.e;
}
int Find(int x) {
if(fa[x] == x) return x;
else return fa[x] = Find(fa[x]);
}
void Union(int x, int y) {
int X = Find(x), Y = Find(y);
if(X != Y) fa[Y] = X;
}
int G(int x) {
return lower_bound(l + 1, l + len + 1, x) - l;
}
int main() {
int t, n;
cin >> t;
while(t--) {
len = 0;
memset(l, 0, sizeof(l));
cin >> n;
for(int p = 1; p <= 2 * n; p++)
fa[p] = p;
for(int p = 1; p <= n; p++) {
cin >> T[p].a >> T[p].b>> T[p].e;
l[p * 2 - 1] = T[p].a, l[p * 2] = T[p].b;
}
sort(T, T + n + 1, cmp);
sort(l + 1, l + 2 * n + 1);
len = unique(l + 1, l + 2 * n + 1) - l;
bool vis = 0;
for(int p = 1; p <= n; p++) {
if(T[p].e) Union(G(T[p].a), G(T[p].b));
else if(Find(G(T[p].a)) == Find(G(T[p].b))) {
cout << "NO" << endl;
vis = 1;
break;
}
}
if(!vis) cout << "YES" << endl;
}
}
绿题都被卡,我废了/kk/kk/kk/kk/kk