Pagini recente » Istoria paginii runda/simulare_oni_2021_12 | Cod sursa (job #177567) | Statistici Safta Catalin Mihai (saftacatalin) | Istoria paginii runda/mihai | Cod sursa (job #1043277)
#include<fstream>
#include<vector>
#define N 1000100
#define logo 22
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,M,i,j,l,lg[N<<1],m[logo][N<<1],x,viz[N],s[N<<1],t,a,b,dif;
vector<int> v[N];
int H[N<<3],sol;
void dfs(int nod)
{
s[++t]=nod;
if(!viz[nod])
viz[nod]=t;
for(int i=0;i<v[nod].size();++i)
{
dfs(v[nod][i]);
s[++t]=nod;
}
}
void update(int st,int dr,int po)
{
if(st==dr)
{
H[po]=s[i];
return;
}
int mij=(st+dr)>>1;
if(i<=mij)
update(st,mij,po<<1);
else
update(mij+1,dr,(po<<1)+1);
H[po]=min(H[po<<1],H[(po<<1)+1]);
}
void find(int st,int dr,int po)
{
if(st>=a&&dr<=b)
{
sol=min(sol,H[po]);
return;
}
int mij=(st+dr)>>1;
if(a<=mij)
find(st,mij,(po<<1));
if(b>mij)
find(mij+1,dr,(po<<1)+1);
}
int main ()
{
f>>n>>M;
for(i=2;i<=n;++i)
{
f>>x;
v[x].push_back(i);
}
dfs(1);
for(i=1;i<=t;++i)
update(1,t,1);
for(i=1;i<=M;++i)
{
f>>a>>b;
a=viz[a]; b=viz[b];
if(a>b)swap(a,b);
sol=(1<<29);
find(1,t,1);
g<<sol<<"\n";
}
return 0;
}