提交时间:2025-06-12 16:13:10

运行 ID: 38072

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define m_p make_pair #define p_b push_back #define pi pair<int,int> #define p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=3e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,p; vector<int>E[maxn]; struct _ { int op,i,l,r; _(){} _(int _op,int _i,int _l,int _r){op=_op,i=_i,l=_l,r=_r;} }d[maxn]; int fa[maxn]; namespace dsu { int fd(int u){if(u==fa[u])return u;return fd(fa[u]);} int nnd(){++p,fa[p]=p;return p;} void mg(int x,int y){ x=fd(x),y=fd(y);int z=nnd(); fa[x]=z,fa[y]=z; } } namespace Flow { int S,T; int nxt[maxn],hd[maxn],hhd[maxn],to[maxn],w[maxn],ww[maxn],dis[maxn],deg[maxn],cnt=1; void link(int x,int y,int cl,int cr){ deg[x]-=cl,deg[y]+=cl; int c=cr-cl; ++cnt;nxt[cnt]=hd[x],to[cnt]=y,w[cnt]=c;hd[x]=cnt; ++cnt;nxt[cnt]=hd[y],to[cnt]=x,w[cnt]=0;hd[y]=cnt; } int fix(int n){ S=n+1,T=n+2; int s=0; up(i,1,n){ s+=abs(deg[i]); if(!deg[i])continue; if(deg[i]>0)link(S,i,0,deg[i]); else link(i,T,0,-deg[i]); } return s; } int dfs(int u,int fl){ if(u==T)return fl; int ans=0; for(int &i=hd[u];i;i=nxt[i])if(w[i]&&dis[to[i]]==dis[u]+1){ int val=dfs(to[i],min(fl,w[i])); w[i]-=val,w[i^1]+=val; ans+=val,fl-=val; if(!fl)break; } if(!ans)dis[u]=-1; return ans; } bool bfs(){ memcpy(hd,hhd,sizeof(hd)); memset(dis,-1,sizeof(dis)); queue<int>q;q.push(S);dis[S]=0; while(!q.empty()){ int u=q.front();q.pop(); for(int i=hd[u];i;i=nxt[i])if(w[i]&&dis[to[i]]==-1)dis[to[i]]=dis[u]+1,q.push(to[i]); } return dis[T]!=-1; } int dinic(){ memcpy(ww,w,sizeof(w)); memcpy(hhd,hd,sizeof(hd)); int res=0; while(bfs())res+=dfs(S,1e9); return res; } } int flg[maxn],flg2[maxn]; int id[maxn]; void slv(){ n=read(),m=read(); up(i,1,m){ int op=read(),x=read(),l=(op!=2)?read():0,r=(op==3)?read():0; d[i]=_(op,x,l,r); } p=n;up(i,1,n)fa[i]=i; up(i,1,m){ if(d[i].op==1){ int id=dsu::nnd(); dsu::mg(d[i].i,id); dsu::mg(d[i].l,id); } else if(d[i].op==2)Flow::link(dsu::fd(d[i].i),d[i].i,0,1),flg2[d[i].i]=Flow::cnt; else { int id=dsu::nnd(); flg[dsu::fd(d[i].i)]=1; Flow::link(dsu::fd(d[i].i),id,d[i].l,d[i].r),fa[dsu::fd(d[i].i)]=id; } } up(i,1,p)if(fa[i]!=i&&(!flg[i]))Flow::link(i,fa[i],0,1e9); up(i,1,n)if(!flg2[i])Flow::link(dsu::fd(i),i,0,1),flg2[i]=Flow::cnt; int val1=Flow::fix(p)/2; int val2=Flow::dinic(); if(val1!=val2)return printf("NO\n"),void(); printf("YES\n"); up(i,1,n)printf("%c",Flow::w[flg2[i]]?'R':'B'); } int main(){ //freopen("marble.in","r",stdin),freopen("marble.out","w",stdout); slv(); return 0; }