Cod sursa(job #2368497)

Utilizator alexandruilieAlex Ilie alexandruilie Data 5 martie 2019 16:22:45
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define nmax 100005
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int viz[nmax],niv[nmax],use[nmax],n,k,i,dim,j,x,y,nr,v1[nmax],m[2*nmax][22],l;
void df(int i,int nv)
{
    dim++;
    v1[dim]=i;
    use[i]=1;
    niv[dim]=nv;
    if(!viz[i]) viz[i]=dim;
    for(int j=0;j<v[i].size();j++)
        if(!use[v[i][j]]) {df(v[i][j],nv+1);
    v1[++dim]=i;
    niv[dim]=nv;}

}
int main()
{
    f>>n>>k;
    for(i=2;i<=n;i++)
        {
            f>>x;
            v[x].push_back(i);
            v[i].push_back(x);
        }
    df(1,0);
    v1[++dim]=1;
    for(i=1;i<=dim;i++) m[i][0]=i;
    for(j=1;(1<<j)<=dim;j++)
        for(i=1;i<=dim-(1<<j)+1;i++)
        if(niv[m[i][j-1]]<=niv[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i][j-1];
        else m[i][j]=m[i+(1<<(j-1))][j-1];
    for(i=1;i<=k;i++)
    {
        f>>x>>y;
        if(viz[x]>viz[y]) swap(x,y);
        l=log2(viz[y]-viz[x]+1);
        if(niv[m[viz[x]][l]]<niv[m[viz[y]-(1<<l)+1][l]]) g<<v1[m[viz[x]][l]]<<'\n';
        else g<<v1[m[viz[y]-(1<<l)+1][l]]<<'\n';
    }
    return 0;
}