This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
vector<int> depths;
void DFS(int x, vector<vector<pair<int, int>>>& adj, vector<pair<int, int>>& parent){
for(pair<int, int> p : adj[x]){
int node = p.first;
if(node == parent[x].first) continue;
parent[node] = {x, p.second};
depths[node] = depths[x] + 1;
DFS(node, adj, parent);
}
}
int kth(int a, int dist, vector<vector<int>>& binlift){
for(int k = 0; k < 20; k++){
if((1 << k) & dist){
a = binlift[k][a];
}
}
return a;
}
int lca(int a, int b, vector<vector<int>>& binlift){
if(depths[a] < depths[b]){
b = kth(b, depths[b] - depths[a], binlift);
}else if(depths[b] < depths[a]){
a = kth(a, depths[a] - depths[b], binlift);
}
if(a == b) return a;
int anc = a;
for(int k = 19; k >= 0; k--){
if(binlift[k][a] == binlift[k][b]){
anc = binlift[k][a];
}else{
a = binlift[k][a];
b = binlift[k][b];
}
}
return anc;
}
pair<int, int> increasing(int a, int anc, vector<vector<pair<int, int>>>& inc, vector<vector<int>>& binlift, vector<pair<int, int>>& parent){
int dist = depths[a] - depths[anc];
int good = 1;
int lst = -1;
// cout << "dist "<< dist << endl;
for(int k = 0; k < 20; k++){
if((1 << k) & dist){
good = min(good, inc[k][a].first);
lst = inc[k][a].second;
// cout << "k "<< k << " inc/dec "<< inc[k][a].first << " a "<< a << " good "<< good << endl;
// cout << "lst "<< lst << endl;
a = binlift[k][a];
if(a != anc && lst > parent[a].second) good = 0;
}
}
return {good, lst};
}
pair<int, int> decreasing(int a, int anc, vector<vector<pair<int, int>>>& inc, vector<vector<int>>& binlift, vector<pair<int, int>>& parent){
int dist = depths[a] - depths[anc];
int good = 1;
int lst = -1;
// cout << "dist "<< dist << endl;
for(int k = 0; k < 20; k++){
if((1 << k) & dist){
good = min(good, inc[k][a].first);
lst = inc[k][a].second;
// cout << "k "<< k << " inc/dec "<< inc[k][a].first << " a "<< a << " good "<< good << endl;
// cout << "lst "<< lst << endl;
a = binlift[k][a];
if(a != anc && lst < parent[a].second) good = 0;
}
}
return {good, lst};
}
void solve(){
int N, K; cin >> N >> K;
vector<vector<pair<int, int>>> adj(N);
depths.resize(N);
vector<tuple<int, int, int>> queries;
for(int i = 0; i < N + K - 1; i++){
char c; cin >> c;
if(c == 'C'){
cout << "NOT NOW" << endl;
return;
}else if(c == 'S'){
int a, b; cin >> a >> b; a--; b--;
adj[a].push_back({b, i});
adj[b].push_back({a, i});
}else{
int a, d; cin >> a >> d; a--; d--;
queries.push_back({a, d, i});
}
}
vector<pair<int, int>> parent(N, {-1, -1});
depths[0] = 0;
DFS(0, adj, parent);
vector<vector<int>> binlift(20, vector<int>(N));
for(int k = 0; k < 20; k++){
for(int i = 0; i < N; i++){
if(k == 0) binlift[k][i] = parent[i].first;
else{
if(binlift[k-1][i] == -1) binlift[k][i] = -1;
else binlift[k][i] = binlift[k-1][binlift[k-1][i]];
}
}
}
vector<vector<pair<int, int>>> inc(20, vector<pair<int, int>>(N));
vector<vector<pair<int, int>>> dec(20, vector<pair<int, int>>(N)); //From node to its ancestors.
for(int k = 0; k < 20; k++){
for(int i = 0; i < N; i++){
if(k == 0) inc[k][i] = {1, parent[i].second};
else{
if(binlift[k-1][i] == -1) inc[k][i] = inc[k-1][i];
else{
if(inc[k-1][i].first == 0 || inc[k-1][binlift[k-1][i]].first == 0 || (parent[binlift[k-1][i]].second != -1 && parent[binlift[k-1][i]].second < inc[k-1][i].second)){
inc[k][i].first = 0;
}else inc[k][i].first = 1;
inc[k][i].second = inc[k-1][binlift[k-1][i]].second;
}
}
}
}
for(int k = 0; k < 20; k++){
for(int i = 0; i < N; i++){
if(k == 0) dec[k][i] = {1, parent[i].second};
else{
if(binlift[k-1][i] == -1) dec[k][i] = dec[k-1][i];
else{
if(dec[k-1][i].first == 0 || dec[k-1][binlift[k-1][i]].first == 0 || parent[binlift[k-1][i]].second > dec[k-1][i].second){
dec[k][i].first = 0;
}else dec[k][i].first = 1;
dec[k][i].second = dec[k-1][binlift[k-1][i]].second;
}
}
}
}
// for(int k = 0; k < 3; k++){
// cout << "k "<< k << endl;
// for(int i = 0; i < N; i++){
// cout << "i "<< i << " dec "<< dec[k][i].first << " "<< dec[k][i].second << endl;
// cout << "i "<< i << " binlift "<< binlift[k][i] << endl;
// }
// }
// cout << "dec 3 2^1 "<< dec[1][3].first << endl;
// cout << "PARENTS"<< endl;
// for(int i = 0; i < N; i++){
// cout << "i "<< i << endl;
// cout << "parent "<< parent[i].first << " "<< parent[i].second << endl;
// }
vector<int> ans;
for(tuple<int, int, int> t : queries){
int a = get<0>(t);
int d = get<1>(t);
if(a == d){
ans.push_back(1);
continue;
}
// cout << "a "<< a << " d "<< d << " time "<< get<2>(t) << endl;
int anc = lca(a, d, binlift);
// cout << "anc "<< anc << endl;
int mx = -1;
if(anc != a) mx = parent[a].second;
pair<int, int> firs = increasing(d, anc, inc, binlift, parent);
pair<int, int> sec = decreasing(a, anc, dec, binlift, parent);
mx = max(mx, max(firs.second, sec.second));
// cout << "firs "<< firs.first << " "<< firs.second << " sec "<< sec.first << " " << sec.second << " mx "<< mx << endl;
if(mx > get<2>(t) || firs.first == 0 || sec.first == 0 || (anc != a && anc != d && sec.second != -1 && firs.second > sec.second)){
ans.push_back(0);
}else ans.push_back(1);
}
for(int x : ans) cout << (x == 1 ? "yes" : "no") << endl;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |