Pagini recente » Cod sursa (job #2922772) | Cod sursa (job #2206721) | Cod sursa (job #315554) | Cod sursa (job #994931) | Cod sursa (job #2951252)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N = 1e5;
int dp[18][2*N+1],nivel[N+1];
vector<int>g[N+1];
vector<int>v;
int lvl=1;
int noduri;
void dfs(int node,int lvl)
{
v.push_back(node);
nivel[node]=lvl;
lvl++;
for(int i=0;i<g[node].size();i++)
{
if(nivel[g[node][i]]==0)
{
dfs(g[node][i],lvl);
}
v.push_back(node);
}
}
void build_rmq()
{
for(int i=0;i<v.size();i++)
dp[0][i]=v[i];
int l=log2(v.size());
int l2=v.size();
for(int i=1;i<l;i++)
for(int j=1;j<l2;j++)
{
if(nivel[dp[i-1][j]]<nivel[dp[i-1][j+(1<<(i-1))]])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=dp[i-1][j+(1<<(i-1))];
}
}
int lastappearencex=0,lastappearencey=0;
void findinterv(int x,int y)
{
for(int i=0;i<v.size();i++)
{
if(v[i]==x)
lastappearencex=i;
if(v[i]==y)
lastappearencey=i;
}
}
int findancestor(int x,int y)
{
if(x>y)
swap(x,y);
int length=y-x+1;
int exp=log2(length);
int lint1=(1<<exp);
int cmp=dp[exp][x];
int cmp2=dp[exp][y-lint1+1];
int finali=1e9;
if (nivel[cmp]<finali)
{
finali=cmp;
}
if(nivel[cmp2]<nivel[finali])
finali=cmp2;
out<<finali<<'\n';
}
int main()
{
int perechi;
in>>noduri>>perechi;
for(int i=2;i<=noduri;i++)
{
int node;
in>>node;
g[node].push_back(i);
}
dfs(1,1);
build_rmq();
/*for(int i=0;i<v.size();i++)
{
out<<v[i]<<' ';
}
out<<'\n';
for(int i=0;i<v.size();i++)
{
out<<nivel[v[i]]<<' ';
}
out<<'\n';*/
for(int i=1;i<=perechi;i++)
{
int x,y;
in>>x>>y;
findinterv(x,y);
findancestor(lastappearencex,lastappearencey);
}
return 0;
}