Cod sursa(job #2470475)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 9 octombrie 2019 11:45:00
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX=100005;
int aint[8*NMAX+5];
int parent[NMAX+5],sqparent[NMAX+5],depth[NMAX+5];
void update(int nod,int a,int b,int poz,int val)
{
    if(a==b)
        aint[nod]=val;
    else
    {
    int med=(a+b)>>1;
    if(poz<=med)
        update(2*nod,a,med,poz,val);
    if(poz>med)
        update(2*nod+1,med+1,b,poz,val);
        if(depth[aint[2*nod]]<depth[aint[2*nod+1]])
            aint[nod]=aint[2*nod];
        else
            aint[nod]=aint[2*nod+1];
    }
}
int query(int nod,int a,int b,int x,int y)
{
    if(x<=a&&y>=b)return aint[nod];
    else
    {
        int med=(a+b)>>1,x1=0,y1=0;
        if(x<=med)
            x1=query(2*nod,a,med,x,y);
        if(y>med)
        y1=query(2*nod+1,med+1,b,x,y);
        if(depth[x1]<depth[y1])return x1;
        else
            return y1;
    }
}
int fir[NMAX+5],eul[NMAX+5];
int poz=0;
int depth_max=0;
int h;
vector<int>v[NMAX+5];
void dfs(int nod)
{
    if(depth[nod]>depth_max)depth_max=depth[nod];
    vector<int>::iterator it;
    for(it=v[nod].begin();it!=v[nod].end();it++)
    {
        depth[*it]=depth[nod]+1;
        fir[*it]=++poz;
        eul[poz]=*it;
        dfs(*it);
        eul[++poz]=nod;
    }
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    eul[1]=1;
    poz=1;
    int i,m,n,j;
    scanf("%d%d",&m,&n);
    for(i=2;i<=m;i++)
        {scanf("%d",&parent[i]);v[parent[i]].push_back(i);}
        dfs(1);
        parent[1]=0;
        depth[0]=10000000;
    for(i=1;i<=m;i++)
        {

            update(1,1,poz,fir[i],i);
        }
        for(i=1;i<=n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int ans=query(1,1,poz,min(fir[x],fir[y]),max(fir[x],fir[y]));
        printf("%d\n",ans);
    }
    return 0;
}