Cod sursa(job #1872566)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 8 februarie 2017 13:27:25
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 1e5 + 1000, maxq = 2e6 + 10;

vector<int> fii[maxn] = {};
int n, q, tata[maxn] = {}, val[maxn], rez[maxq] = {};
char rk[maxn] = {};
bitset<maxn> viz = 0;
vector<pair<int, int>> qs[maxn] = {};

int find(const int x){
    return tata[x] ? tata[x] = find(tata[x]) : x; }

int merge(int x, int y){
    x = find(x), y = find(y);
    if(x == y) return x;
    if(rk[x] > rk[y]) swap(x, y);
    if(rk[x] == rk[y]) ++rk[y];
    return tata[y] = x; }

void dfs(const int cur = 1){
    viz[cur] = 1;
    val[cur] = cur;
    for(const auto query : qs[cur]){
        if(!viz[query.first]) continue;
        rez[query.second] = val[find(query.first)]; }
    for(const auto next : fii[cur]){
        dfs(next);
        val[merge(cur, next)] = cur; } }

ifstream f("lca.in");
ofstream g("lca.out");

int main(){
    f >> n >> q;
    for(int i = 2, x; i <= n; ++i){
        f >> x;
        fii[x].push_back(i); }
    for(int i = 0, x, y; i < q; ++i){
        f >> x >> y;
        qs[x].emplace_back(y, i);
        qs[y].emplace_back(x, i); }
    dfs();
    copy_n(rez, q, ostream_iterator<int>(g, "\n"));
    return 0; }