Cod sursa(job #2772111)

Utilizator CelestinNegraru Celestin Celestin Data 30 august 2021 19:31:53
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#define maxi 100005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("lca.in",ios::in);
ofstream g("lca.out",ios::out);
vector<int> V[maxi];
int n,m,euler[maxi<<1],l[maxi<<1],v[maxi<<4],x,k,first[maxi];
bool viz[maxi];
void DFS(int x,int lvl)
{
    viz[x]=true;
    euler[++k]=x;
    l[k]=lvl;
    first[x]=k;
    for(auto a:V[x])
    {
        if(!viz[a])
        {
            DFS(a,lvl+1);
            euler[++k]=x;
            l[k]=lvl;
        }
    }
}
void BUILD(int nod,int st,int dr)
{
    if(st>dr)
        return;
    if(st==dr)
    {
        v[nod]=st;
        return;
    }
    int mid=(st+dr)>>1;
    BUILD(2*nod,st,mid);
    BUILD(2*nod+1,mid+1,dr);
    if(l[v[2*nod]]<=l[v[2*nod+1]])
        v[nod]=v[2*nod];
    else v[nod]=v[2*nod+1];
}
void QUERY(int nod,int st,int dr,int a,int b,int&sol,int&hsol)
{
    if(st>dr)
        return;
    if(st>=a&&dr<=b)
    {
        if(l[v[nod]]<hsol)
        {
            hsol=l[v[nod]];
            sol=euler[v[nod]];
        }
        return;
    }
    int mid=(st+dr)>>1;
    if(a<=mid)
        QUERY(2*nod,st,mid,a,b,sol,hsol);
    if(b>mid)
        QUERY(2*nod+1,mid+1,dr,a,b,sol,hsol);
}
int LCA(int x,int y)
{
   int s=first[x];
   int d=first[y];
   if(s>d)
    swap(s,d);
   int soll=INF;
   int hsoll=INF;
   QUERY(1,1,k,s,d,soll,hsoll);
   return soll;
}
void SOLVE()
{
    int p,t;
    f>>n>>m;
    for(int i=2;i<=n;i++)
    {
        f>>x;
        V[x].push_back(i);
    }
    DFS(1,0);
    BUILD(1,1,k);
    for(int i=1;i<=m;i++)
    {
        f>>p>>t;
        g<<LCA(p,t)<<'\n';
    }
    f.close();
    g.close();
    return;
}
int main()
{
    SOLVE();
    return 0;
}