Pagini recente » Cod sursa (job #1740171) | Cod sursa (job #2031079) | Cod sursa (job #2402733) | Cod sursa (job #2515879) | Cod sursa (job #2499433)
#include <bits/stdc++.h>
#define dim 200010
using namespace std;
int prim[dim],E[dim],N[dim],k,nivel=1,n,m,i,x,lun,lungime,j,y;
short Log[dim];
vector <int> L[dim];
int rmq[18][dim];
void dfs(int nod,int tata)
{
prim[nod]=++k;
E[k]=nod;
N[k]=nivel;
for(int i=0; i<L[nod].size(); i++)
{
if(L[nod][i]==tata)
continue;
nivel++;
dfs(L[nod][i],nod);
nivel--;
E[++k]=nod;
N[k]=nivel;
}
}
void query(int x,int y){
if(x>y)
swap(x,y);
int put=Log[y-x+1];
cout<< min(rmq[put][x],rmq[put][y-put+1])<<"\n";
}
int main()
{
cin>>n>>m;
for(i=2; i<=n; i++)
{
cin>>x;
L[x].push_back(i);
L[i].push_back(x);
}
dfs(1,0);
/// fac rmq
for(i=1; i<=k; i++)
rmq[0][i]=N[i];
for(lun=1; lun<=17; lun++)
{
lungime=(1<<lun);
lungime/=2;
for(j=1; j<=k; j++)
{
rmq[lun][j]=min(rmq[lun-1][j],rmq[lun-1][j+lungime]);
cout<<rmq[lun][j]<<" ";
}
cout<<endl;
}
Log[1]=1;
Log[2]=1;
for(i=3; i<=n; i++)
Log[i]=1+Log[i/2];
for(i=1; i<=m; i++)
{
cin>>x>>y;
//cout<<prim[x]<<" "<<prim[y]<<" --\n";
query(prim[x],prim[y]);
}
}