Pagini recente » Istoria paginii planificare/camp-500 | Cod sursa (job #3293589) | Cod sursa (job #3149351) | Cod sursa (job #3284734) | Cod sursa (job #3285968)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n;
int m[100001][18];
int e[100001][18];
vector<int>a[100001];
bool marc[100001];
int euler[100001];
int niv[100001];
int first[100001];
int nivel[100001];
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++;
return min(e[l][k],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++)
{
nivel[i]=niv[euler[i]];
m[i][0]=nivel[i];
e[i][0]=euler[i];
}
for(k=1;k<17;k++)
for(i=0;i+(1<<k)-1<nr;i++)
{
m[i][k]=min(m[i][k-1],m[i+(1<<k-1)][k-1]);
e[i][k]=min(e[i][k-1],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;
}