Cod sursa(job #2229876)

Utilizator MaaaaaCristina Ma Maaaaa Data 8 august 2018 12:20:15
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
int n, m, t[nmax], a[nmax][20], niv[nmax];
vector<int> v[nmax];
fstream f1("lca.in", ios::in);
fstream f2("lca.out", ios::out);
///a[i][j]=al 2^j-lea stramos al nodului i
void din()
{
    int i, j;
    for(i=1; i<=n; i++)
        a[i][0]=t[i];
    for(j=1; j<=log2(n); j++)
        for(i=1; i<=n; i++)
           a[i][j]=a[a[i][j-1]][j-1];
}
int lca(int x, int y)
{
    int j;
    if(niv[y]< niv[x]) swap(x, y);
    for(j=log2(n); j>=0; j--)
        if(niv[a[y][j]]>= niv[x]) y=a[y][j];
    if(x==y) return x;

     for(j=log2(n); j>=0; j--)
         if(a[x][j]!=a[y][j]) {x=a[x][j]; y=a[y][j];}
    return t[x];
}
void dfs(int nod)
{
    niv[nod]=niv[t[nod]]+1;
    for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
        if(*it!=t[nod])
        dfs(*it);
}
int main()
{
    int i, x, y;
    f1>>n>>m;
    for(i=2; i<=n; i++)
        {
         f1>>t[i];
         v[i].push_back(t[i]); v[t[i]].push_back(i);
         }
    din();
    dfs(1);
    for(i=1; i<=m; i++)
    {
        f1>>x>>y;
        f2<<lca(x, y)<<"\n";
    }
    return 0;
}