Cod sursa(job #2392513)

Utilizator AndreiTudorSpiruAndrei Spiru AndreiTudorSpiru Data 30 martie 2019 09:34:30
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100001];
long long nr,p[200010],e[200010];
int n,m,i,x,d[5000010][25],j,q,a,b,ad[500010],y;
void df(int o,int a)
{
    nr++;
    int i;
    ad[nr]=a;
    if(p[o]==0)p[o]=nr;
    e[nr]=o;
    for(i=0;i<v[o].size();i++)
    {
    df(v[o][i],a+1);
    nr++;

    ad[nr]=a;
    e[nr]=o;
    }
}

int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    df(1,0);

    for(i=1;i<=nr;i++)
    {
    d[i][0]=e[i];
    }
    for (j=1; (1<<j)<=nr; j++)
    {
        for (i=1; i+(1<<j)-1<=nr; i++)
        {
            if (ad[p[d[i][j-1]]]>ad[p[d[i+(1<<(j-1))][j-1]]]) d[i][j]=d[i+(1<<(j-1))][j-1];
            else d[i][j]=d[i][j-1];
        }
    }
    for(q=1;q<=m;q++)
    {  f>>x>>y;
       if (p[x]>p[y]) swap(x,y);
        int k=log2(p[y]-p[x]+1);
        if (ad[p[d[p[x]][k]]]>ad[p[d[p[y]-(1<<k)+1][k]]])
            g<<d[p[y]-(1<<k)+1][k]<<'\n';
        else g<<d[p[x]][k]<<'\n';
    }
    return 0;
}