Cod sursa(job #1126035)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 26 februarie 2014 20:51:30
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int nmax = 100005;
int i,j,p,n,m,x,y,d,lca,cnt,level[2*nmax],euler[2*nmax],first[nmax],rmq[18][2*nmax];
vector<int> v[nmax];
void dfs(int x,int l)
{
    euler[++cnt]=x;
    first[x]=cnt;
    level[cnt]=l;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
    {
        dfs(*it,l+1);
        euler[++cnt]=x;
        level[cnt]=l;
    }
}
int main()
{
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=2;i<=n;i++)
	{
	    scanf("%d",&x);
	    v[x].push_back(i);
	}
    dfs(1,0);
    for(i=1;i<=cnt;i++) rmq[0][i]=i;
    for(i=1,p=2;p<=cnt;i++,p<<=1)
        for(j=1;j+p-1<=cnt;j++)
        {
            rmq[i][j]=rmq[i-1][j];
            if(level[rmq[i-1][j+p/2]]<level[rmq[i][j]])
                rmq[i][j]=rmq[i-1][j+p/2];
        }
    for(;m;m--)
    {
        scanf("%d%d",&x,&y);
        x=first[x]; y=first[y];
        if(x>y) swap(x,y); d=y-x+1;
        for(i=0,p=1;p<=d;p<<=1,i++);
        if(i) i--; p>>=1;
        lca=rmq[i][x];
        if(level[rmq[i][y-p+1]]<level[rmq[i][x]])
            lca=rmq[i][y-p+1];
        printf("%d\n",euler[lca]);
    }
	return 0;
}