Pagini recente » Cod sursa (job #3292684) | Rating Ilea Lucian (ilucian1) | Cod sursa (job #2862940) | Profil maricasorin | Cod sursa (job #3286192)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n;
int e[100001][18];
vector<int>a[200001];
bool marc[200001];
int euler[200001];
int niv[200001];
int first[200001];
int nr;
void dfs(int k)
{
int i;
marc[k]=1;
if(first[k]==0)
first[k]=nr+1;
euler[++nr]=k;
for(i=0;i<a[k].size();i++)
{
if(marc[a[k][i]]==0)
{
niv[a[k][i]]=niv[k]+1;
dfs(a[k][i]);
euler[++nr]=k;
}
}
}
int query(int l,int r)
{
int lenght=r-l+1;
int k=0;
while((1<<(k+1))<=lenght)
k++;
if(niv[e[l][k]]<niv[e[r-(1<<k)+1][k]])
return e[l][k];
else
return e[r-(1<<k)+1][k];
}
int main()
{
f>>n;
int i,j,k;
int x,y;
for(i=1;i<=n-1;i++)
{
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
dfs(1);
for(i=1;i<=nr;i++)
e[i][0]=euler[i];
for(k=1;k<17;k++)
for(i=1;i+(1<<k)-1<=nr;i++)
{
if(niv[e[i][k-1]]<niv[e[i+(1<<k-1)][k-1]])
e[i][k]=e[i][k-1];
else
e[i][k]=e[i+(1<<k-1)][k-1];
}
int q;
f>>q;
for(i=1;i<=q;i++)
{
f>>x>>y;
int st,dr;
st=min(first[x],first[y]);
dr=max(first[x],first[y]);
g<<query(st,dr)<<endl;
}
return 0;
}