Pagini recente » Cod sursa (job #2031723) | Cod sursa (job #2544128) | Cod sursa (job #884594) | Cod sursa (job #990728) | Cod sursa (job #1227159)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream is("lca.in");
ofstream os("lca.out");
int N, M, x, y, L, minim(99999999), st, dr;
int Value[32001], Vis[32001],B[32001];
vector <int> G[32001];
int H[32001],E[32001],Sz;
int VA[10*32000+1];
void Input();
void DFS(int node, int lv);
void Build(int node, int left, int right);
void Query(int node, int left, int right);
void Debug();
int main()
{
int maxim(-1),minst(9999999),mindr(9999999);
Input();
DFS(1,0);
Build(1,1,Sz);
Debug();
for ( int i = 1; i <= M; ++i )
{
minim = 9999999;
is >> x >> y;
st = B[x];
dr = B[y];
if ( dr < st )
swap(st,dr);
Query(1,1,Sz);
os << minim << '\n';
}
is.close();
os.close();
}
void Input()
{
is >> N >> M;
for ( int i = 1; i <= N-1; ++i )
{
is >> x;
G[x].push_back(i+1);
}
}
void DFS(int node, int lv)
{
Vis[node] = true;
Sz++;
E[Sz] = node;
H[Sz] = node;
B[node] = Sz;
for ( int i = 0; i < G[node].size(); ++i )
{
if ( Vis[G[node][i]] == false )
{
DFS(G[node][i],lv+1);
Sz++;
E[Sz] = node;
H[Sz] = lv;
}
}
}
void Debug()
{
}
void Build(int node, int left, int right)
{
if ( left == right )
{
VA[node] = left;
return;
}
int mid = (left+right)/2;
Build(2*node,left,mid);
Build(2*node+1,mid+1,right);
if ( H[VA[2*node]] <= H[VA[2*node+1]] )
VA[node] = VA[2*node];
else
VA[node] = VA[2*node+1];
}
void Query(int node, int left, int right)
{
if ( st <= left && right <= dr )
{
if ( minim > H[VA[node]] )
minim = E[VA[node]];
return;
}
int mij = (left+right)/2;
if ( st <= mij ) Query(node*2,left,mij);
if ( mij < dr ) Query(node*2+1,mij+1,right);
}