Cod sursa(job #3319360)

Utilizator gabi072Sanda Gabriel gabi072 Data 31 octombrie 2025 21:19:48
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define pb push_back
const int lg=18;
int eul[100001],d[200001],nod[200001];
vector<int> v[100001];
int cnt=1;
int a[lg][200001];
struct sprtbl {
    sprtbl(int n) {
        for (int i=1;i<=n;++i)
            a[0][i]=i;
        for (int i=1;i<lg;++i) {
            for (int j=1;j<=n-(1<<i)+1;++j) {
                if (d[a[i-1][j]]<d[a[i-1][j+(1<<(i-1))]])
                    a[i][j]=a[i-1][j];
                else
                     a[i][j]=a[i-1][j+(1<<(i-1))];
            }
        }
    }
    int solve(int x,int y) {
        int l=y-x+1;
        int logg=__lg(l);
        if (d[a[logg][x]]<d[a[logg][y-(1<<logg)+1]])
            return nod[a[logg][x]];
        else
            return nod[a[logg][y-(1<<logg)+1]];
    }
};
void dfs(int n,int depth) {
    d[cnt]=depth;
    eul[n]=cnt;
    nod[cnt]=n;
    for (int i:v[n]) {
        cnt++;
        dfs(i,depth+1);
        cnt++;
        nod[cnt]=n;
        d[cnt]=depth;
        eul[n]=cnt;
    }
}
int main() {
    int n,m;
    fin>>n>>m;
    for (int i=2;i<=n;++i) {
        int x;
        fin>>x;
        v[x].pb(i);
    }
    dfs(1,1);
    sprtbl table(cnt);
    for (int i=1;i<=m;++i) {
        int x,y;
        fin>>x>>y;
        fout<<table.solve(min(eul[x],eul[y]),max(eul[x],eul[y]))<<'\n';
    }
}