rt,思路已确认没问题
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
//如果有一个已经染色的黑点在一个白点右下方,则不合法
struct node{
int x,y;
char c;
}a[N],q[N];
map<int,int>mp;
int n,m,cnt,maxi,lsh[N];
bool cmp(node x,node y){
return x.c<y.c;
}
bool cmp2(node x,node y){
if(x.x==y.x)return x.y<y.y;
return x.x<y.x;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].x>>a[i].y>>a[i].c;
lsh[++cnt]=a[i].x;
lsh[++cnt]=a[i].y;
}
sort(lsh+1,lsh+cnt+1);
cnt=unique(lsh+1,lsh+cnt+1)-(lsh+1);
for(int i=1;i<=cnt;i++)mp[lsh[i]]=i;
for(int i=1;i<=m;i++){
a[i].x=mp[a[i].x];
a[i].y=mp[a[i].y];
maxi=max(a[i].x,max(a[i].y,maxi));
}
sort(a+1,a+m+1,cmp);
cnt=0;
int flag=-1;
for(int i=1;i<=m;i++){
if(a[i].c=='B'){
q[++cnt]=a[i];
}else{
flag=i;
break;
}
}
if(flag==-1){
puts("Yes");
return 0;
}
sort(q+1,q+cnt+1,cmp2);
for(int i=flag;i<=m;i++){
int l=1,r=cnt;
int ansl=-1;
while(l<=r){
int mid=l+r>>1;
if(q[mid].x>=a[i].x){
ansl=mid;
r=mid-1;
}else l=mid+1;
}
if(ansl==-1){
continue;
}
int ans=-1;
l=ansl,r=cnt;
while(l<=r){
int mid=l+r>>1;
if(q[mid].y>=a[i].y){
ans=1;
break;
}else l=mid+1;
}
if(~ans){
puts("No");
return 0;
}
}
puts("Yes");
return 0;
}