有两个点MLE,其他错的点全都是WA。
#include<bits/stdc++.h>
using namespace std;
//#define getchar getchar_unlocked //关闭调试
inline int read(){
int x=0,t=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')t=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*t;
}
const int N=1e5+5;
int n,m,x,y;
struct edge{int x,y;}e[N];
int dfn[N],tot,low[N],co[N],col;
bool bridge[N];
vector<pair<int,int> >p[N],g[N];
inline void tarjan(int u,int fa){
dfn[u]=low[u]=++tot;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].first;
if(v==fa)continue;
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])bridge[g[u][i].second]=true;
}
else low[u]=min(low[u],dfn[v]);
}
}
inline void getco(int x,int col){
co[x]=col;
for(int i=0;i<g[x].size();i++){
int y=g[x][i].first,z=g[x][i].second;
if(!bridge[z]&&!co[y])getco(y,col);
}
}
int dep[N],fa[N],num[N],son[N],in[N],out[N],top[N],tot_time,nw[N];
inline void dfs1(int x,int from){
dep[x]=dep[from]+1;
fa[x]=from;
for(int i=0;i<p[x].size();i++){
if(p[x][i].first!=from){
int y=p[x][i].first;
dfs1(y,x);
num[x]+=num[y];
if(num[y]>num[son[x]])son[x]=y;
}
}num[x]++;
}
inline void dfs2(int x,int tp,int from){
top[x]=tp;
in[x]=++tot_time;
if(!son[x]){out[x]=tot_time;return ;}
dfs2(son[x],tp,x);
for(int i=0;i<p[x].size();i++){
if(p[x][i].first!=from&&p[x][i].first!=son[x]){
dfs2(p[x][i].first,p[x][i].first,x);
}nw[p[x][i].second]=in[p[x][i].first];
}out[x]=tot_time;
}
int w[N*4];
inline int ask(int l,int r,int x,int m){
if(w[m]||l==r)return w[m];
else {
int mid=(l+r)>>1;
if(x<=mid)return ask(l,mid,x,m*2);
else return ask(mid+1,r,x,m*2+1);
}
}
inline void change(int l,int r,int x,int y,int m,int k){
if(x<=l&&r<=y)w[m]=k;
else {
int mid=(l+r)>>1;
if(x<=mid)change(l,mid,x,y,m*2,k);
if(y>mid)change(mid+1,r,x,y,m*2+1,k);
}
}
inline void replace(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
// cout<<in[top[x]]<<" "<<in[x]<<" 2"<<endl;
change(1,col,in[top[x]],in[x],1,2);
x=fa[top[x]];
}else {
// cout<<in[top[y]]<<" "<<in[y]<<" 1"<<endl;
change(1,col,in[top[y]],in[y],1,1);
y=fa[top[y]];
}
}
if(x==y)return ;
if(dep[x]>dep[y])change(1,col,in[son[y]],in[x],1,2);
else change(1,col,in[son[x]],in[y],1,1);
// if(dep[x]>dep[y])cout<<in[son[y]]<<" "<<in[x]<<" 2"<<endl;
// else cout<<in[son[x]]<<" "<<in[y]<<" 1"<<endl;
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){
e[i].x=read();e[i].y=read();
g[e[i].x].push_back(make_pair(e[i].y,i));
g[e[i].y].push_back(make_pair(e[i].x,i));
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
for(int i=1;i<=n;i++)if(!co[i])getco(i,++col);
for(int i=1;i<=m;i++){
x=co[e[i].x],y=co[e[i].y];
if(x!=y){
p[x].push_back(make_pair(y,i));
p[y].push_back(make_pair(x,i));
}
}
dfs1(1,1);
dfs2(1,1,1);
int q=read();
while(q--){
x=read();y=read();
if(co[x]!=co[y])replace(co[x],co[y]);
}
for(int i=1;i<=m;i++){
x=e[i].x,y=e[i].y;
if(co[x]==co[y])putchar('B');
else {
int NOW=ask(1,col,nw[i],1);
if(!NOW)putchar('B');
else if((NOW==1&&dep[co[x]]<dep[co[y]])||(NOW==2&&dep[co[x]]>dep[co[y]]))putchar('L');
else putchar('R');
}
}
return 0;
}