Cod sursa(job #2917586)

Utilizator tzancauraganuTzanca Uraganu tzancauraganu Data 5 august 2022 20:09:53
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
 
int N, M;
//int v[100010];
int dp[20][200010], ans[20][200010];
int ap[200010];
int logs[200010];
 
vector<int> e[200010];
int ind = 0;
 
void df(int l, int n) {
    ++ind;
    ap[n] = ind;
    dp[0][ind] = l;
    ans[0][ind] = n;
    
    for (auto c : e[n]) {
        df(l + 1, c);
	++ind;
	dp[0][ind] = l;
        ans[0][ind] = n;
    }
    
}
 
int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    
    f >> N >> M;
    //cout << N << M << std::endl;
    logs[0] = 0;
    
    for (int i = 2; i <= N; i++) {
        int p;
        f >> p;
        e[p].push_back(i);
        //cout << p << std::endl;
    }
    
    df(1, 1);
    
    N = ind;
    
    
    for (int i = 1; i <= N; i++) {
        //std::cout << ans[0][i] << ' ';
        logs[i] = 1 + logs[i/2];
    }
    
    //std::cout << std::endl;
    
    for (int l = 2, k = 1; l <= N; l *= 2, k++) {
        for (int i = 1; i + l - 1 <= N; i++) {
            if (dp[k-1][i] < dp[k-1][i + l / 2]) {
                ans[k][i] = ans[k-1][i];
            } else {
                ans[k][i] = ans[k-1][i + l / 2];
            }
            dp[k][i] = min(dp[k-1][i], dp[k-1][i + l / 2]);
        }
    }
    
    for (int i = 1; i <= M; i++) {
        int a, b;
        f >> a >> b;
        //
        //cout << a << b;
        a = ap[a];
        b = ap[b];
        if (a > b)
            swap(a, b);
        //cout << a << ' ' << b << std::endl;
        int l = logs[b - a + 1] - 1;
        g << (dp[l][a] < dp[l][b - (1 << l) + 1] ? ans[l][a] : ans[l][b - (1 << l) + 1])  << '\n';
        //std::cout << std::endl;
    }
    
    //cout << "done" << std::endl;
    f.close();
    g.close();
 
    return 0;
}