Cod sursa(job #2973611)

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

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

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

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

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

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

 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, 1});
     x[i].push_back({a, -1});
    }
    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;
}