#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int> > adj[120005],down[120005];
vector<int> cent[120005];
int del[120005],sz[120005],par[120005],pd[20][120005],up[20][120005],dep[120005];
pair<int,int> updec[20][120005];
int dfssize(int x, int p){
sz[x]=1;
for(auto i:adj[x]){
if(i.first!=p&&!del[i.first]) sz[x]+=dfssize(i.first,x);
}
return sz[x];
}
int find_cent(int x, int p, int tsz){
for(auto i:adj[x]){
if(i.first!=p&&!del[i.first]&&sz[i.first]>tsz/2) return find_cent(i.first,x,tsz);
}
return x;
}
void dfs(int x, int p, int prev, int c, int st, int d){
down[c].push_back({st,prev});
updec[d][x]={st,prev};
for(auto i:adj[x]){
if(i.first!=p&&!del[i.first]&&i.second>prev){
dfs(i.first,x,i.second,c,st,d);
}
}
}
void dfs2(int x, int p, int prev, int c, int st, int d){
up[d][x]=st;
for(auto i:adj[x]){
if(i.first!=p&&!del[i.first]&&i.second<prev){
dfs2(i.first,x,i.second,c,st,d);
}
}
}
bool cmp(pair<int,int> a, pair<int,int> b){return a.second<b.second;}
int build(int x, int d, int pr){
int c=find_cent(x,-1,dfssize(x,-1));
dep[c]=d;
par[c]=pr;
pd[d][c]=c;
for(int i=d; i>0; i--){
if(pd[i][c]==-1) break;
pd[i-1][c]=par[pd[i][c]];
}
for(auto i:adj[c]){
if(!del[i.first]){
dfs(i.first,c,i.second,c,i.second,d);
dfs2(i.first,c,i.second,c,i.second,d);
}
}
sort(down[c].begin(),down[c].end(),cmp);
del[c]=1;
for(auto i:adj[c]){
if(!del[i.first]){
int kid=build(i.first,d+1,c);
cent[c].push_back(kid);
}
}
return c;
}
int fenw[300005];
void update(int x, int v){
for(;x<300005;x+=x&-x) fenw[x]+=v;
}
int query(int x){
int ret=0;
for(;x;x-=x&-x) ret+=fenw[x];
return ret;
}
bool cm2p(pair<pair<int,int>,int> a, pair<pair<int,int>,int> b){return a.first.second<b.first.second;}
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
memset(up,-1,sizeof(up));
memset(par,-1,sizeof(par));
memset(pd,-1,sizeof(pd));
for(int j=0; j<20; j++) for(int i=0; i<120005; i++) updec[j][i]={-1,-1};
int n,k;
cin >> n >> k;
vector<pair<pair<int,int>,int> > qu;
for(int i=0; i<n+k-1; i++){
char cmd;
cin >> cmd;
if(cmd=='S'){
int a,b;
cin >> a >> b;
adj[a].push_back({b,i});
adj[b].push_back({a,i});
}
else if(cmd=='Q'){
int a,b;
cin >> a >> b;
qu.push_back({{a,b},i});
}
else{
int a;
cin >> a;
qu.push_back({{-1,a},i});
}
}
build(1,0,-1);/*
for(int i=1; i<=n; i++){
cout << i << ": ";
for(int j=3; j>=0; j--) cout << pd[j][i] << ' ';
cout << '\n';
}*/
int ans[k];
vector<pair<pair<int,int>,int> > uwu[120005];
for(int i=0; i<k; i++){
if(qu[i].first.first==-1){
ans[i]=1;
int x=qu[i].first.second;
uwu[x].push_back({{-1,qu[i].second},i});
for(int j=dep[x]-1; j>=0; j--){
if(up[j][x]==-1||up[j][x]>=qu[i].second) continue;
ans[i]++;
uwu[pd[j][x]].push_back({{up[j][x],qu[i].second},i});
}
}
else{
int x=qu[i].first.first,y=qu[i].first.second;
if(x==y){
ans[i]=-1;
continue;
}
for(int j=19; j>=0; j--){
if(pd[j][x]==pd[j][y]&&pd[j][x]!=-1){
if(j==dep[x]){
if(up[j][y]!=-1&&up[j][y]<qu[i].second) ans[i]=-1;
else ans[i]=-2;
}
else if(j==dep[y]){
if(updec[j][x].second!=-1&&updec[j][x].second<qu[i].second) ans[i]=-1;
else ans[i]=-2;
}
else{
if(up[j][y]!=-1&&updec[j][x].first!=-1&&up[j][y]<updec[j][x].first&&updec[j][x].second<qu[i].second) ans[i]=-1;
else ans[i]=-2;
}
break;
}
}
}
}
for(int i=1; i<=n; i++){
sort(uwu[i].begin(),uwu[i].end(),cm2p);
int cnt=0;
vector<int> undo;
for(auto j:uwu[i]){
while(cnt<(int)down[i].size()&&down[i][cnt].second<j.first.second){
update(down[i][cnt].first+1,1);
undo.push_back(down[i][cnt].first+1);
cnt++;
}
if(j.second==1){
//cout << i << ' ' << j.first.first << ' ' << j.first.second << '\n';
//cout << query(j.first.second+2)-(j.first.first>=0?query(j.first.first+1):0) << '\n';
}
ans[j.second]+=query(j.first.second+2)-(j.first.first>=0?query(j.first.first+1):0);
}
for(int j:undo) update(j,-1);
}
for(int i=0; i<k; i++){
if(ans[i]<0) cout << (ans[i]==-1?"yes":"no") << '\n';
else cout << ans[i] << '\n';
}
}
/*6 3
S 1 2
S 1 3
C 1
C 3
S 3 4
S 4 5
C 3
S 1 6*/
# | 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... |