#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10, M = 1e6 + 10, Log_N = 26;
struct E {
int u, v;
} edge[M];
int n, m, q;
int e[M], ne[M], p[N], h[N], rh[N], idx;
int dfn[N], low[N], num;
int stk[N], top;
int id[N], cnt;
char res[N];
int fa[N][Log_N], dep[N];
int a[N];
void add(int x, int y, int z, int h[]) {
e[++idx] = y;
p[idx] = z;
ne[idx] = h[x];
h[x] = idx;
}
void tarjan(int u, int fath) {
low[u] = dfn[u] = ++num;
stk[++top] = u;
for(int i = h[u]; i; i = ne[i]) {
int v = e[i];
if(v == fath) continue;
if(!dfn[v]) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
} else {
low[u] = min(low[u], dfn[v]);
}
}
if(low[u] == dfn[u]) {
int y;
cnt++;
do {
y = stk[top--];
id[y] = cnt;
} while(y != u);
}
}
void dfs(int u, int fath) {
for(int i = rh[u]; i; i = ne[i]) {
int v = e[i];
if(v == fath) continue;
dfs(v, u);
a[u] += a[v];
if(a[v] == 1) {
if(id[e[p[i]]] == u) {
res[p[i]] = 'R';
} else {
res[p[i]] = 'L';
}
}
if(a[v] == -1) {
if(id[e[p[i]]] == u) {
res[p[i]] = 'L';
} else {
res[p[i]] = 'R';
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
add(x, y, 0, h), add(y, x, 0, h);
}
scanf("%d", &q);
for(int i = 1; i <= q; i++) {
scanf("%d%d", &edge[i].u, &edge[i].v);
}
for(int i = 1; i <= n; i++) {
if(!dfn[i]) {
tarjan(i, 0);
}
}
for(int i = 1; i <= n; i++) {
for(int j = h[i]; j; j = ne[j]) {
int v = e[j];
int x = id[i], y = id[v];
if(x != y) {
add(x, y, (j & 1) ? j : (j - 1), rh);
}
}
}
for(int i = 1; i <= q; i++) {
if(id[edge[i].u] == id[edge[i].v]) continue;
a[id[edge[i].u]] += 1, a[id[edge[i].v]] -= 1;
}
for(int i = 1; i <= 2 * m; i++) {
res[i] = 'B';
}
dfs(1, 0);
for(int i = 1; i <= 2 * m; i += 2) {
printf("%c", res[i]);
}
return 0;
}
使用了树上差分,可能是边的编号转化问题,求调,求 hack。