Pagini recente » Cod sursa (job #552646) | Cod sursa (job #1332421) | Cod sursa (job #507584) | Cod sursa (job #2102023) | Cod sursa (job #3174543)
///Alexandru Morus
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int v[1000006],vf[1000006],cnt = 0,primul[1000006];
pair <int,int> aint[5000006];
vector<int> g[100006];
int mt[1000006][3],af,afs;
void dfs(int nod, int nivel)
{
vf[nod] = 1;
for(auto i : g[nod])
{
if(vf[i] == 0)
{
cnt ++;
mt[cnt][1] = nod;
mt[cnt][2] = nivel;
if(primul[nod] == 0)
{
primul[nod] = cnt;
}
dfs(i,nivel + 1);
}
}
cnt ++;
mt[cnt][1] = nod;
mt[cnt][2] = nivel;
if(primul[nod] == 0)
{
primul[nod] = cnt;
}
}
void build(int node, int left, int right)
{
if(left == right)
{
aint[node].first = mt[left][2];
aint[node].second = mt[left][1];
return;
}
int mid = (left + right) / 2;
build(2 * node,left,mid);
build(2 * node + 1, mid + 1, right);
if(aint[2 * node].first < aint[2 * node + 1].first)
{
aint[node].first = aint[2 * node].first;
aint[node].second = aint[2 * node].second;
}
else
{
aint[node].first = aint[2 * node + 1].first;
aint[node].second = aint[2 * node + 1].second;
}
}
void query(int node, int left, int right, int a, int b)
{
if(a <= left && right <= b)
{
if(aint[node].first < af)
{
af = aint[node].first;
afs = aint[node].second;
}
return;
}
long long mid = (left + right) / 2;
if(a <= mid)
{
query(2 * node, left, mid,a,b);
}
if(b > mid)
{
query(2 * node + 1, mid + 1, right,a,b);
}
}
int main()
{
int n,i,a,b,m;
in >> n >> m;
for(i = 1; i < n; i ++)
{
in >> v[i];
g[v[i]].push_back(i + 1);
g[i + 1].push_back(v[i]);
}
dfs(1,1);
build(1,1,cnt);
for(i = 1; i <= m; i ++)
{
af = 99999999;
in >> a >> b;
query(1,1,cnt,min(primul[a],primul[b]),max(primul[a],primul[b]));
out << afs << '\n';
}
return 0;
}