Cod sursa(job #2935593)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 7 noiembrie 2022 00:43:21
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ull = uint64_t;
using pi = pair<int, int>;
using ti = tuple<int, int, int>;
using tl = tuple<ll, ll, ll>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
using pl = pair<ll, ll>;
using vi = vector<int>;
using vl = vector<ll>;
using vpi = vector<pi>;
using vpil = vector<pil>;
using vpli = vector<pli>;
using vpl = vector<pl>;
using vti = vector<ti>;
using vtl = vector<tl>;
using vvi = vector<vi>;
using vvl = vector<vl>;
using vvpi = vector<vpi>;
using vvpil = vector<vpil>;
using vvpli = vector<vpli>;
using vvpl = vector<vpl>;
using vvti = vector<vti>;
using vvtl = vector<vtl>;


#if 0
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
#define cin fin
#define cout fout
#endif
const int nmx = 25e4 + 1;
int t[nmx];
int a[20][nmx];
int lg[nmx];
int d[nmx];

vvi g;
int n;

int lca(int u, int v)
{
    if(d[u] < d[v])
        swap(u,v);
    
    while(d[u] != d[v])
    {
        int k = lg[d[v]-d[u]];
        u = a[k][u];
    }
    
    if(u == v)
        return u;
    
    for(int i=lg[d[u]];i>=0;i--)
    {
        if(a[i][u] != a[i][v])
        {
            u = a[i][u];
            v = a[i][v];
        }
    }
    return t[u];
}

void dfs(int k)
{
    d[k] = d[t[k]] + 1;
    for(int to : g[k])
        dfs(to);
}

void prec()
{
	for (int i = 2; i <= n; i++)
		lg[i] = lg[i / 2] + 1;

	for (int i = 1; i <= n; i++)
		a[0][i] = t[i];

	for (int i = 1; (1 << i) <= n; i++)
		for (int j = 1; j <= n; j++)
			a[i][j] = a[i - 1][a[i-1][j]];
}

int main()
{
	int q;
	cin >> n >> q;
	g=vvi(n+1);
	t[1] = 1;
	for(int i=2;i<=n;i++)
	{
		cin >> t[i];
		g[t[i]].emplace_back(i);
	}
	
	prec();
	
	dfs(1);
	
	while (q--)
	{
		int x, y;
		cin >> x >> y;
		cout<< lca(x,y) << "\n";
	}
}