#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)
using ar2 = array<int,2>;
using ar3 = array<int,3>;
const int mxN = (int)1e5+10;
const int mxLg = 18;
map<ar2,int> cnt;
vector<ar3> edges;
int jmp[mxLg][mxN];
bitset<mxN> bridge;
int n, m, k, dfs_tim;
vector<ar2> adj[mxN];
int st[mxN], en[mxN], low[mxN], head[mxN], sub[mxN], ans[mxN];
template<int SZ>
struct DSU{
int p[SZ], sz[SZ];
void init(int n = SZ-1){
for(int i = 1; i <= n; i++) p[i]=i,sz[i]=1;
}
int findSet(int i){ return i==p[i]?i:p[i]=findSet(p[i]); }
bool isSameSet(int i, int j){ return findSet(i)==findSet(j); }
void unionSet(int i, int j){
int x = findSet(i), y = findSet(j);
if(x==y) return;
if(sz[x]<sz[y])swap(x,y);
p[y] = x, sz[x]+=sz[y];
}
};
DSU<mxN> dsu;
template<int SZ>
struct Fenwick{
int fen[SZ];
void init(){
for(int i = 0; i < SZ; i++) fen[i]=0;
}
void upd(int x, int v){
for(++x;x<SZ;x+=x&-x) fen[x]+=v;
}
void upd(int x, int y, int v){
if(x>y) return;
upd(x,v); upd(y+1,-v);
}
int query(int x){
int s = 0;
for(++x; x>0; x-=x&-x)s+=fen[x];
return s;
}
};
Fenwick<mxN> fen;
void ae(int a, int b, int c){
adj[a].pb({b,c}), adj[b].pb({a,c});
}
void dfsBridges(int s, int p){
st[s] = low[s] = ++dfs_tim;
bool ok = 0;
for(auto [u,i] : adj[s]){
if(u==p and !ok) {ok=1; continue;}
if(!st[u]){
dfsBridges(u,s);
low[s] = min(low[s],low[u]);
if(low[u]>st[s]) bridge[i] = 1;
}
else low[s] = min(low[s],st[u]);
}
}
bool isAnc(int a, int b){
return st[a]<=st[b] and en[a]>=en[b];
}
int lca(int a, int b){
if(isAnc(a,b)) return a;
if(isAnc(b,a)) return b;
for(int i = mxLg-1; i>=0; i--)
if(jmp[i][a] and !isAnc(jmp[i][a],b))
a = jmp[i][a];
return jmp[0][a];
}
void dfs(int s, int p){
sub[s] = 1;
for(int i = 0; i < sz(adj[s]); i++){
auto [u,_] = adj[s][i];
if(u==p) continue;
dfs(u,s); sub[s]+=sub[u];
if(adj[s][0][0]==p or sub[u] > sub[adj[s][0][0]])
swap(adj[s][0], adj[s][i]);
}
}
void dfsHld(int s, int p, int h){
st[s] = ++dfs_tim;
head[s] = h; jmp[0][s] = p;
for(auto [u,_] : adj[s]){
if(u==p) continue;
dfsHld(u,s,u==adj[s][0][0]?h:u);
}
en[s] = dfs_tim;
}
void upd(int b, int a, int c){
while(head[a]!=head[b]){
fen.upd(st[head[b]],st[b],c);
b = jmp[0][head[b]];
}
fen.upd(st[a]+1,st[b],c);
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n >> m; dsu.init(n);
for(int i = 0; i < m; i++){
int a, b; cin >> a >> b; ans[i] = 2;
if(a!=b) edges.pb({a,b,i}), ae(a,b,i);
}
for(int i = 1; i <= n; i++)
if(!st[i]) dfsBridges(i,0);
for(auto [a,b,i] : edges)
if(!bridge[i]) dsu.unionSet(a,b);
for(int i = 1; i <= n; i++) adj[i].clear();
for(auto [a,b,i] : edges)
if(bridge[i]) ae(dsu.findSet(a),dsu.findSet(b),i);
fill(st,st+n+1,0); fill(en,en+n+1,0); dfs_tim = 0;
for(int i = 1; i <= n; i++){
int s = dsu.findSet(i);
if(s!=i or st[s]) continue;
dfs(s,0); dfsHld(s,0,s);
}
for(int j = 1; j < mxLg; j++)
for(int i = 1; i <= n; i++)
jmp[j][i] = jmp[j-1][jmp[j-1][i]];
cin >> k; fen.init();
while(k--){
int a, b, c; cin >> a >> b;
a = dsu.findSet(a), b=dsu.findSet(b);
if(a==b) continue;
c = lca(a,b);
if(c==a) upd(b,c,-1);
else if(c==b) upd(a,c,1);
else upd(a,c,1), upd(b,c,-1);
}
for(auto [a,b,i] : edges){
if(!bridge[i]) continue;
a = dsu.findSet(a);
b = dsu.findSet(b);
bool ok = 0;
if(st[a]>st[b])swap(a,b),ok=1;
int v = fen.query(st[b]);
if(v) ans[i]=(v<0)^ok;
}
for(int i = 0; i < m; i++)
cout << "LRB"[ans[i]]; cout << "\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... |