#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define fs first
#define sc second
using namespace std;
const int N = 1e5 + 123;
const int LOG = 18;
const int INF = 3e18;
int n, m, q;
int h[N], zir[N], col[N], par[LOG][N], man[N], mos[N];
bool brr[N], mark[N];
vector<pair<int,int>> g[N];
pair<pair<int,int>, int> edg[N];
int ans[N];
void dfs1(int v, int p, int id) {
    mark[v] = 1;
    if (p == -1) h[v] = 0;
    zir[v] = h[v];
    for (auto &[u, idx] : g[v]) {
        if (idx == id) continue;
        if (!mark[u]) {
            h[u] = h[v] + 1;
            dfs1(u, v, idx);
            zir[v] = min(zir[v], zir[u]);
            if (zir[u] > h[v]) brr[idx] = 1;
        } else if (u != p) {
            zir[v] = min(zir[v], h[u]);
        }
    }
}
void dfs2(int v) {
    mark[v] = 1;
    col[v] = q;
    for (auto &[u, _] : g[v]) {
        if (!mark[u]) dfs2(u);
    }
}
void dfs3(int v, int p) {
    mark[v] = 1;
    par[0][v] = p;
    for (int i = 1; i < LOG; i++) par[i][v] = par[i-1][par[i-1][v]];
    for (auto &[u, _] : g[v]) {
        if (u != p) {
            h[u] = h[v] + 1;
            dfs3(u, v);
        }
    }
    man[v] = h[v];
    mos[v] = h[v];
}
int jump(int v, int d) {
    for (int i = 0; i < LOG; i++)
        if (d & (1 << i))
            v = par[i][v];
    return v;
}
int lca(int u, int v) {
    if (h[u] < h[v]) swap(u, v);
    u = jump(u, h[u] - h[v]);
    if (u == v) return u;
    for (int i = LOG-1; i >= 0; i--) {
        if (par[i][u] != par[i][v]) {
            u = par[i][u];
            v = par[i][v];
        }
    }
    return par[0][u];
}
void dfs4(int v, int p, int id = 0) {
    mark[v] = 1;
    for (auto &[u, idx] : g[v]) {
        if (u != p and !mark[u]) {
            dfs4(u, v, idx);
            man[v] = min(man[v], man[u]);
            mos[v] = min(mos[v], mos[u]);
        }
    }
    if (id) {
        int a = col[edg[id].fs.fs];
        int b = col[edg[id].fs.sc];
        if (man[v] != h[v]) ans[id] = (a == p ? 1 : 2);
        else if (mos[v] != h[v]) ans[id] = (a == p ? 2 : 1);
        else ans[id] = 0;
    }
}
signed main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int a, b; cin >> a >> b;
        edg[i] = {{a, b}, i};
        g[a].pb({b, i});
        g[b].pb({a, i});
        brr[i] = false;
        ans[i] = 0;
    }
    memset(mark, 0, sizeof(mark));
    for (int i = 1; i <= n; i++) if (!mark[i]) dfs1(i, -1, -1);
    for (int i = 1; i <= n; i++) {
        g[i].clear();
        mark[i] = 0;
    }
    for (int i = 1; i <= m; i++) {
        if (!brr[i]) {
            int a = edg[i].fs.fs, b = edg[i].fs.sc;
            g[a].pb({b, i});
            g[b].pb({a, i});
        }
    }
    q = 0;
    for (int i = 1; i <= n; i++) {
        if (!mark[i]) {
            q++;
            dfs2(i);
        }
    }
    for (int i = 1; i <= n; i++) {
        g[i].clear();
        mark[i] = 0;
        h[i] = 0;
        man[i] = INF;
        mos[i] = INF;
    }
    for (int i = 1; i <= m; i++) {
        if (brr[i]) {
            int a = col[edg[i].fs.fs], b = col[edg[i].fs.sc];
            g[a].pb({b, i});
            g[b].pb({a, i});
        }
    }
    for (int i = 1; i <= q; i++) if (!mark[i]) dfs3(i, i);
    int Q; cin >> Q;
    for (int i = 0; i < Q; i++) {
        int a, b; cin >> a >> b;
        a = col[a], b = col[b];
        if (a == b) continue;
        int c = lca(a, b);
        man[b] = min(man[b], h[c]);
        mos[a] = min(mos[a], h[c]);
    }
    memset(mark, 0, sizeof(mark));
    for (int i = 1; i <= q; i++) if (!mark[i]) dfs4(i, i);
    for (int i = 1; i <= m; i++) {
        if (ans[i] == 1) cout << "R";
        else if (ans[i] == 2) cout << "L";
        else cout << "B";
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |