Cod sursa(job #1373374)

Utilizator cojocarugabiReality cojocarugabi Data 4 martie 2015 18:19:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
# include <bits/stdc++.h>
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
int s[123456];
int lg[123456];
int nv[123456];
int dp[123456][22];
int shift(int x,int y)
{
    while (y)
    {
        x = dp[x][lg[y&-y]];
        y -= y&-y;
    }
    return x;
}
int lca(int x,int y)
{
    if (nv[x] < nv[y]) y = shift(y,nv[y] - nv[x]);
    else x = shift(x,nv[x] - nv[y]);
    for (int i=lg[nv[x]];i+1 && x != y;--i)
    if (dp[x][i] != dp[y][i])
    {
        x = dp[x][i];
        y = dp[y][i];
    }
    if (x == y) return x;
    x = dp[x][0];
    y = dp[y][0];
    return x;
}
int main(void)
{
    int n,m,x,y;
    fi>>n>>m;
    for (int i=2;i<=n;++i) lg[i] = lg[i>>1] + 1;
    for (int i=2;i<=n;++i) fi>>dp[i][0],nv[i] = nv[dp[i][0]] + 1;
    for (int j=1;j<=lg[n];++j)
        for (int i=1;i<=n;++i) dp[i][j] = dp[dp[i][j-1]][j-1];
    while (m --)
    {
        fi>>x>>y;
        fo << lca(x,y) << '\n';
    }
    return 0;
}