Cod sursa(job #3005215)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 16 martie 2023 20:15:42
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
#define DIM 100001
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,t,nr,x,y,poz[DIM],e[2*DIM];
vector<int> l[DIM];
struct elem {
    int nod,niv;
}r[25][2*DIM];

void dfs(int nod,int niv) {
    r[0][++nr]={nod,niv};
    poz[nod]=nr;
    for (int i=0;i<l[nod].size();i++) {
        int vec=l[nod][i];
        dfs(vec,niv+1);
        r[0][++nr]={nod,niv};
    }
}

void rmq() {
    for (int p=1;(1<<p)<=nr;p++)
        for (int i=1;i<=nr;i++) {
            r[p][i]=r[p-1][i];
            int j=i+(1<<(p-1));
            if (j<=nr && r[p-1][j].niv<r[p][i].niv)
                r[p][i]=r[p-1][j];
        }
    e[1]=0;
    for (int i=2;i<=nr;i++)
        e[i]=e[i/2]+1;
}

int lca(int x,int y) {
    x=poz[x];
    y=poz[y];
    if (x>y)
        swap(x,y);
    int k=e[y-x+1];
    int l=(1<<k);
    if (r[k][x].niv<r[k][y-l+1].niv)
        return r[k][x].nod;
    return r[k][y-l+1].nod;
}

int main() {
    fin>>n>>q;
    for (int i=2;i<=n;i++) {
        fin>>t;
        l[t].push_back(i);
    }
    dfs(1,0);
    rmq();
    while (q--) {
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }
    return 0;
}