#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
struct reb {
int u, i, a, b;
reb(int u = 0, int i = 0, int a = 0, int b = 0) {
this->u = u;
this->i = i;
this->a = a;
this->b = b;
}
};
int n, m;
vector<vector<reb>> normg;
vector<vector<reb>> org;
vector<bool> used;
vector<bool> doner;
vector<int> topsort;
vector<int> color;
int c = 0;
vector<vector<reb>> g;
vector<int> parent;
vector<vector<int>> lift;
int logg = 18;
vector<int> h;
int high = 0;
void dfs_newg(int v) {
topsort.push_back(v);
used[v] = 1;
for (auto& r : normg[v]) {
if (!doner[r.i]) {
doner[r.i] = 1;
reb rr(v, r.i, r.a, r.b);
org[r.u].push_back(rr);
}
if (!used[r.u]) {
dfs_newg(r.u);
}
}
}
void paint(int v) {
color[v] = c;
for (auto& r : org[v]) {
if (color[r.u] == -1) {
paint(r.u);
}
}
}
void countlca() {
lift[0] = parent;
for (int k = 1; k < logg; k++) {
for (int v = 0; v < c; v++) {
lift[k][v] = lift[k - 1][lift[k - 1][v]];
}
}
}
int lca(int v, int u) {
if (h[v] < h[u]) {
swap(v, u);
}
int dist = h[v] - h[u];
for (int k = 0; k < logg; k++) {
if ((dist & (1 << k)) != 0) {
v = lift[k][v];
}
}
for (int k = logg - 1; k >= 0; k--) {
if (lift[k][v] != lift[k][u]) {
u = lift[k][u];
v = lift[k][v];
}
}
if (u == v) {
return u;
}
return parent[u];
}
void dfs_parent(long long v, long long p) {
used[v] = 1;
parent[v] = p;
h[v] = high;
high++;
for (auto& r : g[v]) {
if (!used[r.u]) {
dfs_parent(r.u, v);
}
}
high--;
}
vector<int> valul;
vector<long long> val_1, val1;
long long dfs_1(long long v, long long p) {
long long sum = val_1[v];
used[v] = 1;
for (auto& r : g[v]) {
if (r.u == p) {
continue;
}
sum += dfs_1(r.u, v);
}
if (sum > 0) {
valul[v] = -1;
}
return sum;
}
long long dfs1(long long v, long long p) {
long long sum = val1[v];
used[v] = 1;
for (auto& r : g[v]) {
if (r.u == p) {
continue;
}
sum += dfs1(r.u, v);
}
if (sum > 0) {
valul[v] = 1;
}
return sum;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
normg.resize(n);
vector<reb> allrebs(m);
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
a--, b--;
reb ab(b, i, a, b);
allrebs[i] = ab;
reb ba(a, i, a, b);
normg[a].push_back(ab);
normg[b].push_back(ba);
}
used.resize(n);
doner.resize(m);
org.resize(n);
for (int i = 0; i < n; i++) {
if (!used[i]) {
dfs_newg(i);
}
}
color.resize(n, -1);
for (auto& v : topsort) {
if (color[v] == -1) {
paint(v);
c++;
}
}
g.resize(c);
for (int i = 0; i < n; i++) {
for (auto& r : normg[i]) {
if (color[r.a] != color[r.b]) {
reb rrr(color[r.u], r.i, r.a, r.b);
g[color[i]].push_back(rrr);
}
}
}
parent.resize(c);
h.resize(c);
used.assign(c, 0);
for (int i = 0; i < c; i++) {
if (!used[i]) {
dfs_parent(i, i);
}
}
lift.resize(logg, vector<int>(c));
countlca();
int p;
cin >> p;
val_1.resize(c);
val1.resize(c);
for (int gh = 0; gh < p; gh++) {
int a, b;
cin >> a >> b;
a--, b--;
a = color[a];
b = color[b];
if (a == b) {
continue;
}
int l = lca(a, b);
if (a != l) {
val_1[a]++;
val_1[l]--;
}
if (b != l) {
val1[b]++;
val1[l]--;
}
}
valul.resize(c);
used.assign(c, 0);
for (long long i = 0; i < c; i++) {
if (!used[i]) {
dfs_1(i, i);
}
}
used.assign(c, 0);
for (long long i = 0; i < c; i++) {
if (!used[i]) {
dfs1(i, i);
}
}
for (int i = 0; i < m; i++) {
if (color[allrebs[i].a] == color[allrebs[i].b]) {
cout << 'B';
continue;
}
reb r = allrebs[i];
r.a = color[r.a];
r.b = color[r.b];
if (h[r.a] > h[r.b]) {
int val = valul[r.a];
if (val == -1) {
cout << 'R';
}
else if (val == 1) {
cout << 'L';
}
else {
cout << 'B';
}
}
else {
int val = valul[r.b];
if (val == 1) {
cout << 'R';
}
else if (val == -1) {
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... |