Cod sursa(job #3263411)

Utilizator BogaBossBogdan Iurian BogaBoss Data 14 decembrie 2024 11:17:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define NMAX 100100
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

unordered_map<int,int> um;
vector<int> e[100005];
vector<pair<int,int>> euler;

void dfs(int node, int depth)
{
    euler.emplace_back(depth, node);
    for(auto adj : e[node])
    {
        dfs(adj, depth+1);
        euler.emplace_back(depth, node);
    }
}

pair<int,int> rmq[200005][18];
int p2[200005];

int main()
{
    int n, m;
    fin >> n >> m;
    for(int i = 2; i<=n ;i++)
    {
        int x;
        fin >> x;
        e[x].push_back(i);
    }
    dfs(1,0);

    n = euler.size();
    int f = 0;
    for(int i = 1; i<=n; i++)
    {
        if(i == (1<<(f+1)))
            f++;
        p2[i] = f;
    }

    for(int i = 1; i<=n; i++)
        rmq[i][0] = euler[i-1];

    for(int j = 1; j<=p2[n]; j++)
    {
        for(int i = 1; i + (1<<(j-1)) <= n; i++)
            rmq[i][j] = min(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]);
    }

    for(int i = 0; i<n; i++)
        if(um[euler[i].second] == 0)
            um[euler[i].second] = i+1;

    for(int i = 1; i<=m; i++)
    {
        int x, y;
        fin >> x >> y;
        x = um[x];
        y = um[y];
        if(y < x)
            swap(y,x);
        int l = p2[y-x+1];
        fout << min(rmq[x][l], rmq[y-(1<<l)+1][l]).second << '\n';
    }
    return 0;
}