Cod sursa(job #2495412)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 19 noiembrie 2019 12:43:53
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<int>v[100005];
int mod;
int h[100005],sqh[100005],t[100005],sqt[100005];
void dfs(int nod)
{
  vector<int>::iterator it;
  for(it=v[nod].begin();it!=v[nod].end();it++)
  {
      int l=*it;
      h[l]=h[nod]+1;
      sqh[l]=h[l]/mod;
      t[l]=nod;
      sqt[l]=sqt[nod];
      if(h[l]%mod==0)
      {
          sqt[l]=nod;
      }
      dfs(l);
  }
}

int f(int a,int b)
{
    if(h[a]>h[b])swap(a,b);
    if(a==b)return a;
    return f(a,t[b]);
}
int sqf(int a,int b)
{
    if(h[a]>h[b])swap(a,b);
    if(a==b)return a;
    if(sqt[a]!=sqt[b])
        return sqf(a,sqt[b]);
    return f(a,b);
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    mod=sqrt((double)n);
    int i;
    for(i=2;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        v[a].push_back(i);
    }
    h[1]=1;
    sqh[1]=0;
    t[1]=0;
    sqt[1]=0;
    dfs(1);
    for(i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",sqf(a,b));
    }
    return 0;
}