Cod sursa(job #2934766)

Utilizator RaresPoinaruPoinaru-Rares-Aurel RaresPoinaru Data 6 noiembrie 2022 11:22:59
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");

const int MAXN=1000010;
const int LGMAX=20;

int tati[MAXN],n,q,ti[MAXN],te[MAXN],timp,visit[MAXN],depth[MAXN];
vector <int> g[MAXN];
int tati2[LGMAX][MAXN];

void dfs (int nod, int d){
    if (visit[nod]==1)
        return;
    depth[nod]=d;
    visit[nod]=1;
    ti[nod]=++timp;
    for (int i=0;i<g[nod].size ();++i)
        dfs (g[nod][i],d+1);
    te[nod]=++timp;
}


int main()
{
    fin >>n>>q;
    for (int i=2;i<=n;++i){
        fin >>tati[i];
        g[tati[i]].push_back (i);
        g[i].push_back (tati[i]);
    }

    dfs (1,0);

    /*for (int i=1;i<=n;++i)
        fout <<ti[i]<<' '<<te[i]<<'\n';*/

    for (int i=1;i<=n;++i)
        tati2[0][i]=tati[i];

    for (int i=1;i<LGMAX;++i){
        for (int j=1;j<=n;++j){
            tati2[i][j]=tati2[i-1][tati2[i-1][j]];
        }
    }
    //for (int i=1;i<=n;++i)
    //   fout <<depth[i]<<' ';

    for (int i=1;i<=q;++i){
        int x,y;
        fin >>x>>y;
        if (depth[y]<depth[x])
            swap (x,y);
        if (ti[x]<=ti[y] and te[x]>=te[y]){
            fout <<x<<'\n';
            continue;
        }
        int p=0;
        while ((1<<p)<=depth[x])
            p++;
        p--;
        while (p>-1){
            int tata=tati2[p][x];
            if (tata==0)
                tata=1;
            if (ti[tata]>ti[y] or te[tata]<te[y]){
                x=tata;
            }
            p--;
        }
        fout <<tati[x]<<'\n';
    }
    fin.close ();
    fout.close ();
    return 0;
}