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 pb push_back
#define mp make_pair
#define pii pair<int,int>
const int N=120050;
const int M=2*N;
const int L=20;
int n,q,op[M],x[M],y[M],par[N][L],dep[N],w[N],up[N],dw[N];
vector<pii> E[N];
void DFS1(int u,int p){
if(w[u]>w[p])dw[u]=dw[p],up[u]=p;
else up[u]=up[p],dw[u]=p;
dep[u]=dep[p]+1;
par[u][0]=p;
for(int i=1;i<L;i++)par[u][i]=par[par[u][i-1]][i-1];
for(auto e:E[u])if(e.first!=p){
w[e.first]=e.second;
DFS1(e.first,u);
}
}
int LCA(int u,int v){
if(dep[u]<dep[v])swap(u,v);
for(int i=L-1;~i;i--)if(dep[par[u][i]]>=dep[v])u=par[u][i];
for(int i=L-1;~i;i--)if(par[u][i]!=par[v][i])u=par[u][i],v=par[v][i];
return u==v?u:par[u][0];
}
int Lift(int u,int k){for(int i=L-1;i>=0;i--)if(k>>i&1)u=par[u][i];return u;}
bool conn(int u,int v,int t){
bool ok=true;
int lca=LCA(u,v);
if(u!=lca&&v!=lca){
int pu=Lift(u,dep[u]-dep[lca]-1);
int pv=Lift(v,dep[v]-dep[lca]-1);
if(w[pu]<w[pv])ok=false;
}
if(u!=lca&&dep[lca]<dep[dw[u]])ok=false;
if(v!=lca&&dep[lca]<dep[up[v]])ok=false;
if(u!=lca&&w[u]>t)ok=false;
if(v!=lca&&w[Lift(v,dep[v]-dep[lca]-1)]>t)ok=false;
return ok;
}
int main(){
scanf("%i%i",&n,&q);
q+=n-1;
for(int i=1;i<=q;i++){
char ch;
scanf("\n%c %i",&ch,&x[i]);
op[i]=(ch=='S'?1:(ch=='Q'?2:3));
if(op[i]!=3)scanf("%i",&y[i]);
if(op[i]==1){
E[x[i]].pb(mp(y[i],i));
E[y[i]].pb(mp(x[i],i));
}
}
w[1]=1000000;
up[1]=dw[1]=1;
DFS1(1,1);
for(int i=1;i<=q;i++){
if(op[i]==1)continue;
if(op[i]==2){
puts(conn(x[i],y[i],i)?"yes":"no");
continue;
}
}
return 0;
}
Compilation message (stderr)
servers.cpp: In function 'int main()':
servers.cpp:44:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
44 | scanf("%i%i",&n,&q);
| ~~~~~^~~~~~~~~~~~~~
servers.cpp:48:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
48 | scanf("\n%c %i",&ch,&x[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~
servers.cpp:50:20: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
50 | if(op[i]!=3)scanf("%i",&y[i]);
| ~~~~~^~~~~~~~~~~~
# | 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... |