Cod sursa(job #2628089)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 14 iunie 2020 13:19:41
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;
/***********************************************/
/// input/output
ifstream f("lca.in");
ofstream g("lca.out");
/***********************************************/
///variabile globale

vector<int>v[100001];
int nr , ap[100001], n , m;
pair<int, int>rmq[800001][21];
/***********************************************/
///------------------------------------------------------
inline void readInput()
{

    f>>n>>m;
    for(int i=2;i<=n;i++)
    {
        int x;
        f>>x;
        v[x].push_back(i);
    }
}
///------------------------------------------------------
inline void dfs(int nod, int grad)
{
   rmq[++nr][0].first= grad;
   rmq[nr][0].second = nod;
   if(v[nod].size()==0)
   {
       return;
   }
   for(int i=0;i< v[nod].size();i++)
   {
       if(!ap[v[nod][i]])
       {
           ap[v[nod][i]] =nr+1;
           dfs(v[nod][i], grad+1);
           rmq[++nr][0].first =grad;
           rmq[nr][0].second = nod;
       }
   }
}
///------------------------------------------------------
inline void calculeazaRMQ()
{
    int k=log2(nr);
	for(int j = 1; j <= k+1; ++j)
		for(int i = 1; i <= nr - (1 << j) + 1; ++i)
		{
		    int x = rmq[i][j - 1].first;
		    int y = rmq[i][j - 1].second;
		    int x2 = rmq[i + (1 << (j - 1))][j - 1].first;
		    int y2 = rmq[i + (1 << (j - 1))][j - 1].second;
		    if(x<x2)
                rmq[i][j] = {x,y};
            else rmq[i][j] = {x2,y2};
		}
}

///------------------------------------------------------
inline void Solution()
{
    ap[1]=1;
    dfs(1,0);
    calculeazaRMQ();
    while(m--)
    {
        int st , dr;
        f>>st>>dr;
        st= ap[st];
        dr = ap[dr];
        if(st>dr) swap(st , dr);
        int k = log2(dr-st+1);
        int x= rmq[st][k].first;
        int y = rmq[st][k].second;
        int x2 = rmq[dr- (1<<k) + 1][k].first;
        int y2 = rmq[dr - (1<<k) +1 ][k].second;
        if(x<x2)
        {
            g<<y<<"\n";
        }
        else g<<y2<<"\n";
    }
}

///------------------------------------------------------

int main()
{
    readInput();
    Solution();
    return 0;
}