Submission #557184

#TimeUsernameProblemLanguageResultExecution timeMemory
557184MilosMilutinovicInside information (BOI21_servers)C++14
50 / 100
248 ms30428 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...