Cod sursa(job #2786587)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 21 octombrie 2021 11:03:11
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m,i,j,k,l,e[20][300003],f[100001],g[100001],x;
struct t{int x,p;}a[100000];
void v(int p)
{
g[a[p].x]=l,e[0][l++]=a[p].x;
while(a[p].x==a[f[a[p].x]].p)v(f[a[p].x]++),e[0][l++]=a[p].x;
}
int main()
{
a[0].x=1;
in>>n>>m;
for(i=1;i<n;i++)
    in>>a[i].p,a[i].x=i+1;
sort(a,a+n,[](t a,t b){return a.p<b.p;});
for(i=0;i<n;i++)if(f[a[i].p]==0)f[a[i].p]=i;
//for(i=0;i<n;i++)cout<<a[i].p<<' '<<a[i].x<<'\n';
//for(i=1;i<=n;i++)cout<<f[i]<<' ';cout<<'\n';
v(0);
//for(i=0;i<l;i++)cout<<e[0][i]<<' ';
for(k=1;k<20;k++)
{
    j=1<<(k-1),i=l;
    while(--i+j>=l)e[k][i]=e[k-1][i];
    while(i>=0)e[k][i]=bmin(e[k-1][i],e[k-1][i+j]),i--;
}
//for(i=0;i<5;i++){for(j=0;j<l;j++)cout<<e[i][j]<<' ';cout<<'\n';}
while(m--)
{
    in>>i>>j;
    i=g[i],j=g[j];
    if(i>j)sw(i,j);
    j++,k=19,x=INT_MAX;
    while(j>i)
    {
        if(j-i>=1<<k)x=bmin(x,e[k][i]),i+=1<<k;
        k--;
    }
    out<<x<<'\n';
}
}