Pagini recente » Cod sursa (job #820530) | Cod sursa (job #278230) | Cod sursa (job #1669996) | Cod sursa (job #2501411) | Cod sursa (job #2164995)
#include <fstream>
#define nmax 100001
#define inf 2e9
#include <cmath>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int eu[2*nmax];
int n,m1,i,m[2*nmax][20],l,lg,mn,nr,j,x,y,diff,use[nmax],fr[nmax],ni[2*nmax];
void df(int i,int niv)
{
int j,sz;
eu[++nr]=i;
ni[nr]=niv;
if(!fr[i]) fr[i]=nr;
use[i]=1;
sz=v[i].size();
for(j=0;j<sz;j++)
if(!use[v[i][j]]) {df(v[i][j],niv+1);
eu[++nr]=i;
ni[nr]=niv;}
}
int main()
{
f>>n>>m1;
for(i=2;i<=n;i++)
{
f>>x;
v[i].push_back(x);
v[x].push_back(i);
}
df(1,0);
ni[1]=0;
eu[++nr]=1;
for(i=1;i<=nr;i++) m[i][0]=i;
for(j=1;(1<<j)<=nr;j++)
for(i=1;i<=nr-(1<<j)+1;i++)
if(ni[m[i][j-1]]<ni[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i][j-1];
else m[i][j]=m[i+(1<<(j-1))][j-1];
for(i=1;i<=m1;i++)
{
f>>x>>y;
x=fr[x];
y=fr[y];
if(x>y) swap(x,y);
diff=(y-x)+1;
l=(int)log2(diff);
if(ni[m[x][l]]<ni[m[y-(1<<l)+1][l]]) g<<eu[m[x][l]]<<'\n';
else g<<eu[m[y-(1<<l)+1][l]]<<'\n';
}
return 0;
}