标签:-- out wap while putchar pre put back logs
#include <bits/stdc++.h>
using namespace std;
int n,tree[500005][21],deep[500005];
vector<int> v[500005];
void qin(int &aaa){
char c=getchar();
int ans=0;
while(c<‘0‘||c>‘9‘)c=getchar();
while(c>=‘0‘&&c<=‘9‘)ans=ans*10+c-‘0‘,c=getchar();
aaa=ans;
}
void qout(int aaa){
char s[11];
int n=0;
while(aaa>0){
s[++n]=aaa%10+‘0‘;
aaa/=10;
}
for(int i=n;i>=1;i--)putchar(s[i]);
putchar(‘\n‘);
}
void dfs(int now,int l){
for(int i=0;i<v[now].size();i++)
if(v[now][i]!=l){
tree[v[now][i]][0]=now;
deep[v[now][i]]=deep[now]+1;
dfs(v[now][i],now);
}
}
void inti(){
for(int i=1;i<=19;i++)
for(int j=1;j<=n;j++)
tree[j][i]=tree[tree[j][i-1]][i-1];
}
int LCA(int a,int b){
if(deep[a]<deep[b])swap(a,b);
int c=deep[a]-deep[b],ii=0;;
while(c>0){
if(c&1)a=tree[a][ii];
c>>=1;
ii++;
}
if(a==b)return a;
for(int i=19;~i;i--)
if(tree[a][i]!=tree[b][i])a=tree[a][i],b=tree[b][i];
return tree[a][0];
}
int main(){
int m,s;
qin(n);qin(m);qin(s);
for(int i=1;i<n;i++){
int a,b;
qin(a);qin(b);
v[a].push_back(b);
v[b].push_back(a);
}
dfs(s,0);
inti();
for(int i=1;i<=m;i++){
int aa,ab;
qin(aa);
qin(ab);
qout(LCA(aa,ab));
}
return 0;
}
标签:-- out wap while putchar pre put back logs
原文地址:http://www.cnblogs.com/HC-LittleJian/p/7522306.html