Pagini recente » Cod sursa (job #3171890) | Cod sursa (job #2459719) | Cod sursa (job #1692504) | Cod sursa (job #2958837) | Cod sursa (job #3003339)
#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],poz[N+1];
vector<int>g[N+1];
vector<int>v;
int lvl=1;
int noduri;
int var=0;
void dfs(int node,int lvl)
{
v.push_back(node);
var++;
poz[node]=var;
nivel[node]=lvl;
lvl++;
for(int i=0;i<g[node].size();i++)
{
if(nivel[g[node][i]]==0)
{
dfs(g[node][i],lvl);
var++;
}
v.push_back(node);
poz[node]=var;
}
}
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 findancestor(int x,int y)
{
int lastx=poz[x]-1;
int lasty=poz[y]-1;
if(lastx>lasty)
swap(lastx,lasty);
int length=lasty-lastx+1;
int exp=log2(length);
int lint1=(1<<exp);
int cmp=dp[exp][lastx];
int cmp2=dp[exp][lasty-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=1;i<=noduri;i++)
out<<poz[i]<<' ';
out<<'\n';
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;
findancestor(x,y);
}
return 0;
}