#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <algorithm>
#include <functional>
#include <fstream>
using namespace std;
#define int long long
signed main () {
    ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);
    int N = 0, M = 0;
    cin >> N >> M;
    vector <vector <int> > gr (N + 1);
    vector <pair <int, int> > in_v (M + 1);
    map <pair <int, int>, int> revin;
    for (int i = 1; i <= M; i++) {
        int a = 0, b = 0;
        cin >> a >> b;
        revin[{a, b}] = i;
        revin[{b, a}] = i;
        in_v[i] = {a, b};
        gr[a].emplace_back (b);
        gr[b].emplace_back (a);
    }
    // Step 1, depth
    vector <int> depth (N + 1);
    vector <vector <int> > depth_v (N + 1);
    vector <bool> been (N + 1);
    function <void(int, int)> dfs0 =
    [&](int p, int dep) {
        depth[p] = dep;
        depth_v[dep].emplace_back (p);
        been[p] = 1;
        for (int& e : gr[p])
            if (!been[e])
                dfs0 (e, dep + 1);
    };
    dfs0 (1, 1);
    map <pair <int, int>, bool> m;
    been = vector <bool> (N + 1);
    vector <int> up (N + 1);
    function <void(int, int)> dfs1 =
    [&](int p, int par) {
        been[p] = 1;
        for (int& e : gr[p])
            if (!been[e]) {
                dfs1 (e, p);
                up[p] += up[e];
            } else if (depth[e] < depth[par]) {
                up[e]--;
                up[p]++;
            }
        if (up[p] == 0)
            m[{par, p}] = m[{p, par}] = 1;    };
    dfs1 (1, 0);
    
    been = vector <bool> (N + 1);
    vector <vector <int> > binlift (
        N + 1,
        vector <int> (20)
    );
    vector <int> in (N + 1);
    vector <int> out (N + 1);
    out[0] = 2e9;
    int timer = 1;
    function <void(int,int)> dfs2 =
    [&](int p, int par) {
        in[p] = out[p] = ++timer;
        been[p] = 1;
        binlift[p][0] = par;
        for (int i = 1; i < 20; i++)
            binlift[p][i] = binlift[
                binlift[p][i - 1]
            ][i - 1];
        for (int& e : gr[p])
            if (!been[e])
                dfs2 (e, p);
        out[p] = timer;
    };
    auto is_ancestor = [&in, &out](int a, int b) {
        return in[a] <= in[b] && in[b] <= out[a];
    };
    dfs2 (1, 0);
    auto lca = [&](int a, int b) {
        if (is_ancestor (a, b))
            return a;
        if (is_ancestor (b, a))
            return b;
        for (int p = 19; p >= 0; p--)
            if (!is_ancestor (binlift[a][p], b))
                a = binlift[a][p];
        return binlift[a][0];
    };
    vector <int> up_pref (N + 1);
    vector <int> down_pref (N + 1);
    int Q = 0;
    cin >> Q;
    while (Q--) {
        int a = 0, b = 0;
        cin >> a >> b;
        int c = lca (a, b);
        // cout << "LCA " << a << ' ' << b << ' ' << c << '\n';
        up_pref[a]++;
        up_pref[c]--;
        down_pref[b]++;
        down_pref[c]--;
    }
    string ans (M, '.');
    // for (int i = 1; i <= N; i++)
    //     cout << i << ' ' << up_pref[i] << ' ' << down_pref[i] << '\n';
    for (int i = N; i >= 1; i--)
        for (int& e : depth_v[i]) {
            if (binlift[e][0] != 0) {
                if (up_pref[e] >= 1) {
                    int ind = revin[{e, binlift[e][0]}];
                    pair <int, int> p = in_v[ind];
                    if (p == (pair <int, int>){e, binlift[e][0]})
                        ans[ind - 1] = 'R';
                    else
                        ans[ind - 1] = 'L';
                }
                if (down_pref[e] >= 1) {
                    int ind = revin[{e, binlift[e][0]}];
                    pair <int, int> p = in_v[ind];
                    if (p == (pair <int, int>){e, binlift[e][0]})
                        ans[ind - 1] = 'L';
                    else
                        ans[ind - 1] = 'R';
                }
            }
            up_pref[binlift[e][0]] += up_pref[e]; 
            down_pref[binlift[e][0]] += down_pref[e]; 
        }
    
    for (int i = 1; i <= M; i++)
        if (!m[in_v[i]])
            ans[i - 1] = 'B';
    cout << ans << '\n';
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |