#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int>> adj[120001];
array<int,3>P[120001][18][2];
int hi[120001];
void dfs(int x,int p,int co) {
hi[x] = hi[p]+1;
P[x][0][0]={p,co,co};
P[x][0][1]={p,co,co};
for(int i = 1;i<=17;i++){
P[x][i][0] = P[x][i-1][0];
auto[pr,last,ma]=P[x][i][0];
if(last<=P[pr][0][0][1]) {
P[x][i][0]=P[pr][i-1][0];
P[x][i][0][2]=max(P[x][i][0][2],ma);
}
}
for(int i = 1;i<=17;i++){
P[x][i][1] = P[x][i-1][1];
auto[pr,last,ma]=P[x][i][1];
if(last>=P[pr][0][1][1]) {
P[x][i][1]=P[pr][i-1][1];
P[x][i][1][2]=max(P[x][i][1][2],ma);
}
}
for(auto j:adj[x]){
if(j.first==p)continue;
dfs(j.first,x,j.second);
}
}
bool lca(int a,int b,int t) {
int ss = 1 , vv = 0;
if(hi[a]<hi[b]){swap(a,b);swap(ss,vv);}
int ma = 0;
for(int i = 17;i>=0;i--){
if(hi[a]-(1<<i)>=hi[b]){
ma = max(ma,P[a][i][ss][2]);
a = P[a][i][ss][0];
}
}
if(hi[a]!=hi[b])return 0;
if(a==b)return (ma<t);
for(int i = 17;i>=0;i--){
if(P[a][i][ss][0]!=P[b][i][vv][0]){
ma = max({ma,P[a][i][ss][2],P[b][i][vv][2]});
a = P[a][i][ss][0];
b = P[b][i][vv][0];
}
}
if(P[a][0][ss][0]!=P[b][0][vv][0]||hi[a]!=hi[b])return 0;
return max({ma,P[a][0][ss][2],P[b][0][vv][2]})<t;
}
int main() {
int n,q;
cin>>n>>q;
q+=n-1;
pair<char,vector<int>> v[q];
for(int i = 0;i<q;i++) {
cin >> v[i].first;
if(v[i].first=='S') {
int a,b;
cin>>a>>b;
adj[a].push_back({b,i});
adj[b].push_back({a,i});
}else if(v[i].first=='Q') {
int a,b;
cin>>a>> b;
v[i].second={a,b};
}else{
int a;
cin>>a;
}
}
dfs(1,1,0);
for(int i=0;i<q;i++) {
if(v[i].first=='S'||v[i].first=='C')continue;
int a= v[i].second[0],b=v[i].second[1];
if(lca(a,b,i)){
cout<<"yes\n";
}else{
cout<<"no\n";
}
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
56 ms |
14724 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
56 ms |
14724 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
54 ms |
14936 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
54 ms |
14936 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
53 ms |
14808 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
53 ms |
14808 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
66 ms |
14756 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
66 ms |
14756 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
60 ms |
15000 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
60 ms |
15000 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
69 ms |
14932 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
69 ms |
14932 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |