Cod sursa(job #2781206)

Utilizator betybety bety bety Data 8 octombrie 2021 18:52:58
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int lim=1e5+4;
vector<int> vec[lim];
pair<int,int> tree[18][2*lim];
int poz[lim],cnt;
int lg[2*lim];
bool ok[lim];
int n,q,x,y;
void df(int nod,int add)
{
    ok[nod]=true;
    poz[nod]=++cnt;
    tree[0][cnt]={add,nod};
    for(int x:vec[nod])
    if(!ok[x])
    {
        df(x,add+1);
        poz[nod]=++cnt;
        tree[0][cnt]={add,nod};
    }
}
void rmq()
{
    for(int i=2;i<=cnt;++i)
        lg[i]=lg[i/2]+1;
    for(int p=1;p<=lg[cnt];++p)
    for(int i=1;i+(1<<p)-1<=cnt;++i)
        tree[p][i]=min(tree[p-1][i],tree[p-1][i+(1<<(p-1))]);
}
int lca(int x,int y)
{
    x=poz[x],y=poz[y];
    if(x>y) swap(x,y);
    int d=lg[y-x+1];
    return min(tree[d][x],tree[d][y-(1<<d)+1]).second;
}
int main()
{
    in>>n>>q;
    for(int i=2;i<=n;++i)
        in>>x,
        vec[x].push_back(i),
        vec[i].push_back(x);
    df(1,0);
    rmq();
    while(q--)
        in>>x>>y,
        out<<lca(x,y)<<'\n';
    return 0;
}