Cod sursa(job #2391812)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 29 martie 2019 11:40:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
const int N=100001,M=30000000;
int n,m,x,y,i,j,g,t,a[N],p[N][19],l[N],o,e;
char r[M];
inline int A()
{
  	int s=0;
  	for(;r[o]<'0'||r[o]>'9';o++);
  	for(;r[o]>='0'&&r[o]<='9';o++)
  		s=s*10+r[o]-'0';
  	return s;
}
inline void S(int x)
{
    int i,d=x>99999?6:x>9999?5:x>999?4:x>99?3:x>9?2:1;
    for(i=d-1;i>=0;x/=10,i--)
        r[e+i]=x%10+48;
    r[e+d]=10,e+=d+1;
}
int main()
{
    freopen("lca.in","r",stdin),freopen("lca.out","w",stdout),fread(r,1,M,stdin),n=A(),m=A(),l[1]=1;
    for(i=2;i<=n;i++)
        a[i]=A(),l[i]=l[a[i]]+1,p[i][0]=a[i];
    for(i=0;i<=n;i++)
    	for(j=1;j<19;j++)
        	p[i][j]=-1;
    for(j=1;j<19;j++)
    	for(i=0;i<=n;i++)
    		if(p[i][j-1]!=-1)
        		p[i][j]=p[p[i][j-1]][j-1];
    while(m--)
	{
        x=A(),y=A();
        if(l[x]<l[y])
            x^=y^=x^=y;
        for(g=1;(1<<g)<=l[x];g++);
        for(i=--g;i>=0;i--)
        	if(l[x]-(1<<i)>=l[y])
            	x=p[x][i];
        if(x==y)
            S(x);
        else
		{
            for(i=g;i>=0;i--)
            	if(p[x][i]!=-1&&p[x][i]!=p[y][i]&&p[y][i]!=-1)
                	x=p[x][i],y=p[y][i];
            S(a[x]);
        }
    }
    fwrite(r,1,e,stdout);
}