Pagini recente » Cod sursa (job #2844157) | Cod sursa (job #3132976) | Cod sursa (job #1667495) | Cod sursa (job #1495620) | Cod sursa (job #2608255)
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define lb long double
#define pb push_back
#define val first
#define node second
#define qwerty3 -> first
#define qwerty4 -> second
#define umap unordered_map
#define uset unordered_set
#define pii pair < int , int >
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
const int N = 100005;
const int M = 1000000007;
const lb PI = acos(-1);
int n , m , x , a , b;
int e[2 * N] , level[N] , first[N];
pii r[2 * N][20];
vector < int > v[N];
int size;
void dfs(int nod , int lev)
{
e[++size] = nod;
level[nod] = lev;
for(int i = 0 ; i < v[nod].size() ; i++)
{
dfs(v[nod][i] , lev + 1);
e[++size] = nod;
}
}
void rmq()
{
int i , j;
for(i = 1 ; i <= 2 * n - 1 ; i++)
r[i][0] = { level[ e[i] ] , e[i] };
for(j = 1 ; (1 << j) <= 2 * n - 1 ; j++)
for(i = 1 ; i + (1 << j) - 1 <= 2 * n - 1 ; i++)
//r[i][j] = r[i][j - 1].val < r[i + (1 << (j - 1))[j - 1].val ? r[i][j - 1] : r[i + (1 << (j - 1))[j - 1];
if(r[i][j - 1].val < r[i + (1 << (j - 1))][j - 1].val)
r[i][j] = r[i][j - 1];
else r[i][j] = r[i + (1 << (j - 1))][j - 1];
}
int LCA(int a , int b)
{
if(first[a] > first[b])
swap(a , b);
a = first[a];
b = first[b];
int l = log2(b - a);
return r[a][l].val < r[b - (1 << l) + 1][l].val ? r[a][l].node : r[b - (1 << l) + 1][l].node;
}
int main()
{
int i;
f >> n >> m;
for(i = 2 ; i <= n ; i++)
{
f >> x;
v[x].pb(i);
}
dfs(1 , 1);
rmq();
for(i = 1 ; i <= 2 * n - 1 ; i++)
if(!first[ e[i] ])
first[ e[i] ] = i;
for(i = 1 ; i <= m ; i++)
{
f >> a >> b;
g << LCA(a , b) << '\n';
}
return 0;
}