Cod sursa(job #2575829)

Utilizator zsraduZamfir Radu zsradu Data 6 martie 2020 15:38:58
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
struct noduri{vector <int> v;int h;}v[100003];///h=height
int n,m,i,j;
int x,y;
int t[18][100003];
void init()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        int tata;
        f>>tata;
        t[0][i]=tata;
        v[tata].v.push_back(i);
        v[i].h=v[tata].h+1;
    }
    for(i=1;(1<<i)<=n;i++)
        for(j=1;j<=n;j++)
            t[i][j]=t[i-1][t[i-1][j]];///t[i][nod]=tatal lui nod cu 2^i mai sus decat nod
}
int get(int nod,int h)
{
    int put=0;
    while(1)
    {
        put++;
        if(v[t[put][nod]].h<h || t[put][nod]==0){put--;break;}
    }
    nod=t[put][nod];
    if(v[nod].h==h)return nod;
    else return get(nod,h);
}
int main()
{
    init();
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        if(v[x].h<v[y].h)swap(x,y);///ca sa modific pe x sa ajung la y
        if(v[x].h!=v[y].h)x=get(x,v[y].h);///acum x si y sunt la aceeasi inaltime
        if(x==y)g<<x<<'\n';
        else
        {
            int putmax=0,hx=v[x].h;
            for(putmax=1;(1<<putmax)<hx;putmax++);
            for(j=putmax;j>=0;j--)
                if(t[j][x] && t[j][x]!=t[j][y])
                {
                    x=t[j][x];
                    y=t[j][y];
                }
            g<<t[0][x]<<'\n';
        }
    }
}