#include <bits/stdc++.h>
using namespace std;
#define TASK "test"
#define int long long
#define ii pair <int, int>
#define fi first
#define sc second
#define rep(i,s,e) for (int i = (s), _e = (e); i <= _e; i++)
#define reo(i,s,e) for (int i = (s), _e = (e); i >= _e; i--)
const int maxn = (int)1e5 + 5;
const int inf = (int)1e9;
const int mod = (int)1e9 + 7;
int n, m, p;
vector <int> adj[maxn];
ii edge[maxn];
unordered_map <int, int> lab;
bool check[maxn];
int timer, low[maxn], num[maxn];
void tarjan (int u = 1, int p = 0)
{
low[u] = num[u] = ++timer;
for (auto v : adj[u])
{
if (v == p) continue;
if (num[v]) low[u] = min(low[u], num[v]);
else
{
tarjan(v, u);
low[u] = min(low[u], low[v]);
if (low[v] == num[v]) check[lab[u * n + v]] = true;
}
}
}
int par[maxn], sz[maxn];
int find (int u)
{
return par[u] == u ? u : par[u] = find(par[u]);
}
void uniset (int u, int v)
{
u = find(u), v = find(v);
if (u == v) return ;
if (sz[u] < sz[v]) swap(u, v);
par[v] = u, sz[u] += sz[v];
}
struct DATA
{
int u, e, is;
} up[maxn];
vector <DATA> new_adj[maxn];
int depth[maxn], ans[maxn];
void dfs (int u = 1, int p = 0)
{
for (auto [v, e, is] : new_adj[u])
{
if (v == p) continue;
depth[v] = depth[u] + 1;
up[v] = {u, e, is ^ 1};
dfs(v, u);
}
}
signed main ()
{
cin.tie(0)->sync_with_stdio(false);
freopen(TASK".inp","r",stdin);
freopen(TASK".out","w",stdout);
cin >> n >> m;
rep (i, 1, m)
{
int u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
edge[i] = {u, v};
lab[u * n + v] = lab[v * n + u] = i;
}
tarjan();
rep (u, 1, n)
{
par[u] = u;
sz[u] = 1;
}
rep (i, 1, m) if (!check[i])
{
int u, v; tie(u, v) = edge[i];
uniset(u, v);
}
rep (i, 1, m) if (check[i])
{
int u, v; tie(u, v) = edge[i];
u = find(u), v = find(v);
new_adj[u].push_back({v, i, 1});
new_adj[v].push_back({u, i, 0});
}
dfs();
rep (i, 1, m) ans[i] = -1;
cin >> p;
while (p--)
{
int u, v; cin >> u >> v;
u = find(u), v = find(v);
if (u == v) continue;
while (depth[u] > depth[v])
{
ans[up[u].e] = up[u].is;
u = up[u].u;
}
while (depth[u] < depth[v])
{
ans[up[v].e] = up[v].is ^ 1;
v = up[v].u;
}
while (u != v)
{
ans[up[u].e] = up[u].is;
u = up[u].u;
ans[up[v].e] = up[v].is ^ 1;
v = up[v].u;
}
}
rep (i, 1, m)
{
if (ans[i] == -1) cout << 'B';
else cout << (ans[i] == 1 ? 'R' : 'L');
}
return 0;
}
Compilation message (stderr)
oneway.cpp: In function 'int main()':
oneway.cpp:79:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
79 | freopen(TASK".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
oneway.cpp:80:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
80 | freopen(TASK".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |