Cod sursa(job #1165324)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 2 aprilie 2014 17:09:40
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int nmax = 100005;
const int lmax = 17;
int n,q,x,y,i,j,dif,f[lmax][nmax],lev[nmax];
vector<int> v[nmax];
void dfs(int x)
{
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
    {
        lev[*it]=lev[x]+1;
        dfs(*it);
    }
}
int main()
{
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(i=2;i<=n;i++)
    {
        scanf("%d",&f[0][i]);
        v[f[0][i]].push_back(i);
    }
    for(i=1;(1<<i)<=n;i++)
        for(j=1;j<=n;j++)
            f[i][j]=f[i-1][f[i-1][j]];
    lev[1]=1; dfs(1);
    for(;q;q--)
    {
        scanf("%d%d",&x,&y);
        if(lev[x]>lev[y]) swap(x,y);
        dif=lev[y]-lev[x];
        for(i=0;i<17;i++)
            if((1<<i)&dif) y=f[i][y];
        if(x==y) {printf("%d\n",x); continue;}
        for(i=16;i>=0;i--)
            if(f[i][x]!=f[i][y])
            {
                x=f[i][x];
                y=f[i][y];
            }
        printf("%d\n",f[0][x]);
    }
	return 0;
}