Cod sursa(job #2364504)

Utilizator EricEric Vilcu Eric Data 4 martie 2019 09:22:14
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int k,n,Q;
int e[200002],h[200002],B[100002],lo1[200002];
int st[400002][20];
struct chld{int c;chld *n;}*a[100002];
void makee(int ch,int cn)
{
    ++k;
    B[cn]=k;
    h[k]=ch;
    e[k]=cn;
    chld *s=a[cn];
    while(s!=NULL)
    {
        makee(ch+1,s->c);
        ++k;h[k]=ch;e[k]=cn;
        s=s->n;
    }
}
void ist()
{
    for(int i=2;i<=k;++i)lo1[i]=lo1[i/2]+1;
    for(int i=1;i<=k;++i)st[i][0]=i;
    for(int i=1;(1<<i)<=k;++i)for(int j=1;j<=k-(1<<i);++j)
    {
        int t=(1<<(i-1));
        if(h[st[j][i-1]]<=h[st[j+t][i-1]])st[j][i]=st[j][i-1];
        else st[j][i]=st[j+t][i-1];
    }
}
int lca(int p1,int p2)
{
    int t=lo1[p2-p1+1];int ot=p2-p1+1-(1<<t);
    if(h[st[p1][t]]>h[st[p1+ot][t]])return st[p1+ot][t];
    return st[p1][t];
}
int main()
{
    f>>n>>Q;
    for(int i=1;i<=n;++i)a[i]=NULL;
    for(int i=2;i<=n;++i)
    {
        int t;f>>t;
        chld *s=new chld;
        s->c=i;s->n=a[t];a[t]=s;
    }
    makee(0,1);
    ist();
    for(;Q>0;--Q)
    {
        int p1,p2;f>>p1>>p2;p1=B[p1];p2=B[p2];
        if(p1>p2)swap(p1,p2);
        g<<e[lca(p1,p2)]<<'\n';
    }
}