Mai intai trebuie sa te autentifici.

Cod sursa(job #2172783)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 15 martie 2018 17:52:07
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100005];
int dp[100005][25],n,lvl[100005];
void update()
{
    int j,i;
    for(j=1;j<=20;j++)
        for(i=2;i<=n;i++)
            dp[i][j]=dp[dp[i][j-1]][j-1];
}
void DFS(int x)
{
    for(int i=0;i<v[x].size();i++)
    {
        lvl[v[x][i]]=lvl[x]+1;
        DFS(v[x][i]);
    }
}
int querry(int x,int y)
{
    int i;
    if(lvl[y]>lvl[x])
        swap(x,y);
    //lvl[x]>lvl[y];
    // egalez nivelele
    for(i=20;i>=0;i--)
        if(lvl[dp[x][i]]>=lvl[y])
            x=dp[x][i];
    if(x==y)
        return x;
    for(i=20;i>=0;i--)
        if(dp[x][i]!=dp[y][i])
        {
            x=dp[x][i];
            y=dp[y][i];
        }
    return dp[x][0];
}
int main()
{
    int i,m,x,y;
    ios::sync_with_stdio(false);
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>dp[i][0];
        v[dp[i][0]].push_back(i);
    }
    lvl[1]=1;
    DFS(1);
    update();
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        g<<querry(x,y)<<'\n';
    }
}