Cod sursa(job #3357950)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 22:09:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <vector>

using namespace std;

vector<int> v[100005];
int d[100005];
int up[100005][18];

void dfs(int nod, int p){
    up[nod][0] = p;
    for(int k=1; k<18; k++) up[nod][k] = up[up[nod][k-1]][k-1];
    for(int i=0; i<v[nod].size(); i++){
        int vec = v[nod][i];
        if(vec != p){
            d[vec] = d[nod] + 1;
            dfs(vec, nod);
        }
    }
}

int main(){
    FILE *fin = fopen("lca.in", "r");
    FILE *fout = fopen("lca.out", "w");
    int n, m;
    fscanf(fin, "%d %d", &n, &m);
    for(int i=2; i<=n; i++){
        int x;
        fscanf(fin, "%d", &x);
        v[x].push_back(i);
        v[i].push_back(x);
    }
    d[1] = 0;
    dfs(1, 1);
    
    for(int i=0; i<m; i++){
        int x, y;
        fscanf(fin, "%d %d", &x, &y);
        if(d[x] < d[y]){
            int aux = x; x = y; y = aux;
        }
        int dif = d[x] - d[y];
        for(int k=0; k<18; k++){
            if((dif>>k) & 1) x = up[x][k];
        }
        if(x == y){
            fprintf(fout, "%d\n", x);
            continue;
        }
        for(int k=17; k>=0; k--){
            if(up[x][k] != up[y][k]){
                x = up[x][k];
                y = up[y][k];
            }
        }
        fprintf(fout, "%d\n", up[x][0]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}