Cod sursa(job #1649236)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 11 martie 2016 12:55:24
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
# include <cstdio>
# include <vector>
# define pb push_back

using namespace std;

FILE *fin = fopen("lca.in", "rt");
FILE *fout = fopen("lca.out", "wt");

const int MAXN = 100005;
const int H = 200;

vector<int> v[MAXN], L(MAXN), T(MAXN), T2(MAXN);
int N, M;

void DFS(int nod, int niv, int tata) {
    T2[nod] = tata;
    L[nod] = niv;

    if (niv % H == 0)
        tata = nod;

    for (int i=0; i<(signed)v[nod].size(); ++i)
        DFS(v[nod][i], tata, niv+1);
}

int LCA(int x, int y) {
    while (T2[x] != T2[y])
        if (L[x] > L[y]) x = T2[x];
                    else y = T2[y];

    while (x != y)
        if (L[x] > L[y]) x = T[x];
                    else y = T[y];

    return x;
}

int main() {
    int i, x, y;

    fscanf(fin, "%d%d", &N, &M);

    for (i=2; i<=N; ++i) {
        fscanf(fin, "%d", &x);
        T[i] = x;
        v[x].pb(i);
    }

    DFS(1, 0, 0);

    for (i=1; i<=M; ++i) {
        fscanf(fin, "%d%d", &x, &y);
        fprintf(fout, "%d\n", LCA(x, y));
    }

    return 0;
}