#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define ins insert
struct TR{
vector<vector<int>> g;
vector<pii> ed;
int n;
TR(int ns){
n = ns;
g.resize(n + 1);
}
void add(int u, int v){
ed.pb({u, v});
g[u].pb(v);
g[v].pb(u);
}
vector<int> sz, h, p, d;
void fill(int v, int pr){
p[v] = pr;
sz[v] = 1;
for (int i: g[v]){
if (i == pr) continue;
d[i] = d[v] + 1;
fill(i, v);
if (sz[i] > sz[h[v]]){
h[v] = i;
}
sz[v] += sz[i];
}
}
vector<int> hd, pos;
int cnt;
void fill_hld(int v, int k){
pos[v] = ++cnt;
hd[v] = k;
if (!h[v]) return;
fill_hld(h[v], k);
for (int i: g[v]){
if (i != p[v] && i != h[v]){
fill_hld(i, i);
}
}
}
vector<int> f, inv;
vector<bool> b;
set<int> st;
void build(){
sz.resize(n + 1);
h.resize(n + 1);
p.resize(n + 1);
d.resize(n + 1);
fill(1, 0);
cnt = 0;
hd.resize(n + 1);
pos.resize(n + 1);
fill_hld(1, 1);
inv.resize(n + 1);
for (int i = 1; i <= n; i++){
inv[pos[i]] = i;
}
f.resize(n + 1);
for (int i = 2; i <= n; i++) st.ins(i);
b.resize(n + 1);
for (auto [x, y]: ed){
// x -> y
if (d[x] > d[y]){
b[x] = 1;
}
else {
b[y] = 0;
}
}
}
int lca(int x, int y){
while (hd[x] != hd[y]){
if (d[hd[x]] > d[hd[y]]){
swap(x, y);
}
y = p[hd[y]];
}
return ((d[x] > d[y]) ? y : x);
}
void upd(int l, int r, bool i){
if (l > r) return;
// cout<<"Yo "<<l<<" "<<b[l]<<" "<<i<<"\n";
auto it = st.lower_bound(l);
vector<int> er;
while (it != st.end() && *it <= r){
er.pb(*it++);
}
for (int j: er) st.erase(j);
for (int j: er){
// cout<<"Cool "<<inv[j]<<" "<<1 + (b[j] ^ i)<<"\n";
f[inv[j]] = 1 + (b[j] ^ i);
}
}
void set_r(int x, int l, bool i){
// cout<<"Hi "<<x<<" "<<l<<" "<<i<<"\n";
while (true){
if (d[l] < d[hd[x]]){
// hd[x] -> x
// x -> ... -> hd[x]
upd(pos[hd[x]], pos[x], i);
x = p[hd[x]];
}
else {
// l -> x
upd(pos[l] + 1, pos[x], i);
break;
}
}
}
void set(int x, int y){
int l = lca(x, y);
set_r(x, l, 0);
set_r(y, l, 1);
}
char get(int x, int y){
if (d[x] > d[y]) swap(x, y);
if (!f[y]) return 'B';
return ((f[y] == 1) ? 'L' : 'R');
}
};
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, m; cin>>n>>m;
vector<pii> g[n + 1], ed;
for (int i = 1; i <= m; i++){
int u, v; cin>>u>>v;
ed.pb({u, v});
if (u == v) continue;
g[u].pb({v, i});
g[v].pb({u, i});
}
vector<bool> used(n + 1);
vector<int> t[n + 1], ind(n + 1);
function<void(int)> dfs = [&](int v){
used[v] = 1;
for (auto p: g[v]){
int i = p.ff;
if (used[i]) continue;
t[i].pb(v);
t[v].pb(i);
ind[i] = p.ss;
dfs(i);
}
};
for (int i = 1; i <= n; i++){
if (!used[i]){
dfs(i);
}
}
vector<int> d(n + 1, -1), par(n + 1);
function<void(int, int)> fill_d = [&](int v, int pr){
par[v] = pr;
for (int i: t[v]){
if (i == pr) continue;
d[i] = d[v] + 1;
fill_d(i, v);
}
};
for (int i = 1; i <= n; i++){
if (d[i] == -1){
fill_d(i, 0);
}
}
vector<int> dp(n + 1, -1);
vector<pii> br;
vector<bool> ban(m + 1);
function<void(int, int)> solve = [&](int v, int pr){
dp[v] = 0;
for (auto p: g[v]){
int i = p.ff;
if (i == pr || v == par[i]) continue;
dp[v] += (2 * (d[i] < d[v]) - 1);
}
for (int i: t[v]){
if (i == pr) continue;
solve(i, v);
dp[v] += dp[i];
}
if (!dp[v]){
ban[ind[v]] = 1;
if (v != 1) br.pb({v, pr});
}
};
for (int i = 1; i <= n; i++){
if (dp[i] == -1){
solve(i, 0);
}
}
fill(used.begin(), used.end(), 0);
vector<int> all[n + 1], gr(n + 1);
int cnt = 0;
function<void(int)> dfs1 = [&](int v){
all[cnt].pb(v);
gr[v] = cnt;
used[v] = 1;
for (auto [i, ii]: g[v]){
if (used[i] || ban[ii]) continue;
dfs1(i);
}
};
for (int i = 1; i <= n; i++){
if (!used[i]){
cnt++;
dfs1(i);
}
}
/*
cout<<"hey"<<"\n";
for (int i = 1; i <= cnt; i++){
for (int j: all[i]){
cout<<j<<" ";
}
cout<<"\n";
}
cout<<"hey"<<"\n";
*/
TR T(cnt);
for (auto [x, y]: br){
x = gr[x]; y = gr[y];
T.add(x, y);
}
T.build();
int q; cin>>q;
for (int i = 1; i <= q; i++){
int x, y; cin>>x>>y;
x = gr[x];
y = gr[y];
if (x != y) T.set(x, y);
}
for (auto [x, y]: ed){
x = gr[x]; y = gr[y];
if (x == y){
cout<<'B';
continue;
}
// cout<<'T';
cout<<T.get(x, y);
}
}
Compilation message
oneway.cpp:120:10: error: declaration of 'void TR::set(int, int)' changes meaning of 'set' [-fpermissive]
120 | void set(int x, int y){
| ^~~
In file included from /usr/include/c++/10/set:61,
from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:87,
from oneway.cpp:1:
/usr/include/c++/10/bits/stl_set.h:94:11: note: 'set' declared here as 'class std::set<int>'
94 | class set
| ^~~