Cod sursa(job #2973612)

Utilizator Luca529Taschina Luca Luca529 Data 1 februarie 2023 14:10:05
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> x[100001];
int niv[100001];

void DFS(int nod)
{vector<int>:: iterator I;
 for(I=x[nod].begin();I<x[nod].end();I++)
 if(*I>0 && niv[*I]==0)
 {niv[*I]=niv[nod]+1;
  DFS(*I);
 }
}

int F(int nod, int v)
{if(niv[nod]==v)return nod;
 else
 {vector<int>:: iterator I;
  for(I=x[nod].begin();I<x[nod].end();I++)
  if(*I<0)return F(-(*I), v);
 }
}

int F1(int a, int b)
{int a1=0, b1=0;
 vector<int>:: iterator I;
 for(I=x[a].begin();I<x[a].end() && a1==0;I++)
 if(*I<0)a1=-(*I);

 for(I=x[b].begin();I<x[b].end() && b1==0;I++)
 if(*I<0)b1=-(*I);

 if(a1!=b1)return F1(a1, b1);
 else return a1;
}

int main()
{   int n, m, a, b;
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {fin>>a;
     x[a].push_back(i);
     x[i].push_back(-a);
    }
    niv[1]=1;
    DFS(1);

    for(int i=1;i<=m;i++)
    {fin>>a>>b;
     if(niv[a]>niv[b])a=F(a, niv[b]);
     else b=F(b, niv[a]);

     if(a==b)fout<<a<<"\n";
     else fout<<F1(a, b)<<"\n";
    }

    return 0;
}