Cod sursa(job #1467701)

Utilizator cojocarugabiReality cojocarugabi Data 3 august 2015 22:56:30
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
# include <bits/stdc++.h>
using namespace std;
int dp[123456][22];
int lg[123456];
int niv[123456];
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 (niv[x] < niv[y])
        y = shift(y,niv[y] - niv[x]);
    else
        x = shift(x,niv[x] - niv[y]);
    for (int k = lg[niv[x]];x != y && k+1;--k)
        if (dp[x][k] != dp[y][k])
            x = dp[x][k],y = dp[y][k];
    if (x == y) return x;
    return dp[x][0];
}
int main(void)
{
    int n,m,a,b;
    ifstream fi("lca.in");
    ofstream fo("lca.out");
    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],niv[i] = niv[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>>a>>b;
        fo << lca(a,b) << '\n';
    }
    return 0;
}