Pagini recente » Cod sursa (job #3190862) | Cod sursa (job #940269) | Cod sursa (job #1781605) | Cod sursa (job #3194679) | Cod sursa (job #3149812)
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int Nmax=100005,Mmax=400005;
int rmq[Mmax][25];
int depth[Nmax],poz[Nmax];
vector<int> v[Nmax],e;
void euler(int i,int d,int prev)
{
depth[i]=d;
e.push_back(i);
poz[i]=e.size()-1;
for(int j=0;j<v[i].size();j++)
{
if(v[i][j]!=prev)
{
euler(v[i][j],d+1,i);
e.push_back(i);
}
}
return;
}
int lca(int i,int j)
{
i=poz[i];
j=poz[j];
if(i>j)
{
int aux=j;
j=i;
i=aux;
}
int x=log2(j-i+1);
int fhalf=depth[e[rmq[i][x]]];
int shalf=depth[e[rmq[j-(1<<x)+1][x]]];
if(fhalf<=shalf)
{
return e[rmq[i][x]];
}
else
{
return e[rmq[j-(1<<x)+1][x]];
}
}
int main()
{
int n,m,x,y;
cin>>n>>m;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y;
v[y].push_back(x);
///v[y].push_back(x);
}
euler(1,0,0);
int n1=e.size();
for(int i=0;i<n1;i++)
{
rmq[i][0]=i;
}
for(int p=1;p<=log2(n1);p++)
{
for(int i=0;i<n1;i++)
{
int fhalf=depth[e[rmq[i][p-1]]];
int shalf=depth[e[rmq[i+(1<<(p-1))][p-1]]];
if(fhalf<=shalf)
{
rmq[i][p]=rmq[i][p-1];
}
else
{
rmq[i][p]=rmq[i+(1<<(p-1))][p-1];
}
}
}
int k,l;
for(int i=1;i<=m;i++)
{
cin>>k>>l;
cout<<lca(k,l)<<'\n';
/*int tlca=0;
for(int j=1;j<=k;j++)
{
cin>>x;
if(depth[x]>1)
{
if(tlca==0) tlca=x;
else tlca=lca(tlca,x);
}
}
if(tlca==1) cout<<"NO"<<'\n';
else cout<<"YES"<<'\n';*/
}
return 0;
}