Cod sursa(job #3211063)

Utilizator DumitrescuADumitrescuA DumitrescuA Data 8 martie 2024 12:16:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

#define MAX 200

vector<int> v[100005];
int v1[100005];
int v2[100005];
int nivel[100005];

void dfs(int nod,int nod1,int niv){//printf("%d",nod);
    int i;
	nivel[nod]=niv;
	v2[nod]=nod1;
	if(niv%MAX==0) nod1=nod;
	for(i=0;i<v[nod].size();i++)
		dfs(v[nod][i],nod1,niv+1);
}

int main()
{
    int n,q,i,a,b;
    cin>>n>>q;
    for(i=2;i<=n;i++){
        cin>>v1[i];
        v[v1[i]].push_back(i);
	}
    dfs(1,1,0);
    while(q){
		cin>>a>>b;
		while(v2[a]!=v2[b]){
			if(nivel[a]>nivel[b])
				a=v2[a];
			else
				b=v2[b];
		}
		while(a!=b){
			if(nivel[a]>nivel[b])
				a=v1[a];
			else
				b=v1[b];
		}
		cout<<a<<"\n";
        q--;
    }

    return 0;
}