Cod sursa(job #2948056)

Utilizator CobzaruAntonioCobzaru Paul-Antonio CobzaruAntonio Data 27 noiembrie 2022 10:23:19
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
vector <int> g[100005];
int e[200005],s,d[100005],f[100005],lg[100005],i,j,k;
int n,m;
int rmq[100005][20];
void dfs (int n,int l)
{
    e[++s] = n;
    d[s] = l;
    f[n] = s;
    for (auto next1 : g[n])
    {
        dfs(next1,l+1);
        e[++s] = n;
        d[s] = l;
    }
}
void build1 ()
{
    int i,j;
    for (i=2;i<=s;i++)
        lg[i] = lg[i/2] + 1;
    for (i=1;i<=s;i++)
        rmq[i][0] = i;
    for (j=1;j<=lg[s];j++)
        for (i=1;i+(1<<j)-1 <= s;i++)
            if (d[rmq[i][j-1]] < d[rmq[i+(1<<(j-1))][j-1]])
                rmq[i][j] = rmq[i][j-1];
            else
                rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
}
int lca (int x,int y)
{
    int answ;
    int dist,p;
    x = f[x];
    y = f[y];
    if (x > y)
        swap(x,y);
    dist = y - x + 1;
    p = lg[dist];
    //d[rmq[i][j-1]];
    int f1 = rmq[x][p];
    int f2 = rmq[y - (1<<p) + 1][p];
    if (d[f1] < d[f2])
        answ = f1;
    else
        answ = f2;
    return e[answ];
}
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    fin >> n >> m;
    for (i=2;i<=n;i++)
    {
        fin >> k;
        g[k].push_back(i);
    }
    dfs(1,0);
    build1();
    for (i=1;i<=m;i++)
    {
        int l,r;
        fin >> l >> r;
        fout << lca(l,r) << '\n';
    }
    return 0;
}