Cod sursa(job #2807152)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 23 noiembrie 2021 15:12:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,q,t[100005],eu[200005],fs[100005],niv[100005],lg[200005],i,j,x,y;
pair<int,int> rmq[25][200005];
vector <int> v[100005];
void dfs(int nod,int ni)
{
    eu[++eu[0]]=nod;
    fs[nod]=eu[0];
    niv[nod]=ni;
    rmq[0][eu[0]].second=nod;
    rmq[0][eu[0]].first=ni;
    for (int i=0;i<v[nod].size();++i)
    {
        dfs(v[nod][i],ni+1);
        eu[++eu[0]]=nod;
        rmq[0][eu[0]].second=nod;
        rmq[0][eu[0]].first=ni;
    }
}
pair<int,int> rm(int x,int y)
{
    int z=lg[y-x+1];
    return min(rmq[z][x],rmq[z][y-(1<<z)+1]);
}
int main()
{
    in>>n>>q;
    for (i=2;i<=n;++i)
    {
        in>>t[i];
        v[t[i]].push_back(i);
    }
    dfs(1,1);
    lg[1]=0;
    for (i=2;i<2*n;++i)
        lg[i]=lg[i/2]+1;
    for (i=1;i<=lg[2*n-1]+2;++i)
    {
        for (j=1;j+(1<<i)-1<=2*n-1;++j)
        {
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
        }
    }
    for (i=1;i<=q;++i)
    {
        in>>x>>y;
        out<<rm(min(fs[x],fs[y]),max(fs[x],fs[y])).second<<'\n';
    }
    return 0;
}