Cod sursa(job #2713843)

Utilizator PulpysimusJurjiu Tandrau Darius Stefan Pulpysimus Data 28 februarie 2021 19:06:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,parents[100001];
vector <int > G[100001];
#define INF 200000001
int euler[200005],k,SparseTable[18][200004],first[100001];

void EulerPath(int node, int ancestor)
{

euler[++k]=node;
if(first[node]==0) first[node]=k;
for(auto x:G[node])
{
    if(x!=ancestor) {EulerPath(x,node); euler[++k]=node;}
}
}
void BuildTable()
{
    int i,j;
    for(i=1;i<=k;i++)
    SparseTable[0][i]=euler[i];



for(j=1;j<=floor(log2(k));j++){
    for(i=1;i<=(k-(1<<j)+1);i++)
{
    SparseTable[j][i]=min(SparseTable[j-1][i+(1<<(j-1))],SparseTable[j-1][i]);

}

}
}
int main()
{
          f>>n>>m;
    int x,y,i;
    for(i=2;i<=n;i++)
    {
        f>>parents[i];
        G[parents[i]].push_back(i);
        G[i].push_back(parents[i]);
    }
          EulerPath(1,1);
          BuildTable();
int j,a,b;

    for(i=1;i<=m;i++)
   {

    f>>x>>y;
    a=first[x];
    b=first[y];
    if(a>b) swap(a,b);
    j=(int)log2(b-a+1);
    g<<min(SparseTable[j][a],SparseTable[j][b-(1<<j)+1])<<"\n";
   }

}