Pagini recente » Cod sursa (job #174887) | Cod sursa (job #1397980) | Cod sursa (job #2754468) | Cod sursa (job #1824743) | Cod sursa (job #2332989)
#include <bits/stdc++.h>
#define Dim 100006
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M,a,b,MIN[Dim],MAX[Dim],nr;
bool viz[Dim];
struct vertex
{
int A,B,Vf;
}R[Dim];
vector <int> V[Dim];
set < pair<int,int> > S;
set < pair<int,int> > ::iterator it;
void DFS(int nod)
{
viz[nod]=1;
++nr;
MIN[nod]=nr;
for(unsigned int i=0;i<V[nod].size();i++)
{
int vecin=V[nod][i];
if(!viz[vecin]) DFS(vecin);
}
MAX[nod]=max(MAX[nod],nr);
}
bool tester(vertex X,vertex Y)
{
if(X.B<Y.B) return 1;
else
if(X.B==Y.B)
{
if(X.A>Y.A) return 1;
else return 0;
}
else return 0;
}
int main()
{
f>>N>>M;
for(int i=1;i<N;i++)
{
f>>a;
V[a].push_back(i+1);
}
DFS(1);
for(int i=1;i<=N;i++)
{
R[i].Vf=i;
R[i].A=MIN[i];
R[i].B=MAX[i];
}
sort(R+1,R+N+1,tester);
for(int i=1;i<=N;i++)
S.insert({R[i].B,i});
for(int i=1;i<=M;i++)
{
f>>a>>b;
it=S.lower_bound({MAX[b],1});
int poz=it->second;
bool stop=1;
while(stop==1)
{
if(R[poz].B!=R[it->second].B) stop=0;
if(R[poz].A<=MIN[a])
{
g<<R[poz].Vf<<'\n';
stop=0;
}
poz++;
}
}
return 0;
}