Pagini recente » Cod sursa (job #500656) | Cod sursa (job #684799) | Cod sursa (job #581012) | Cod sursa (job #594680) | Cod sursa (job #3207558)
#include <iostream>
#include <vector>
using namespace std;
int n ,q;
vector<vector<int> > adj;
int euler[200002];
int height[100001];
int low[100001];
bool vizitat[100001];
int rmq[19][200002];
int puteri[19];
void preCalc2()
{
puteri[0] = 1;
for(int i = 1; i<=18;i++)
puteri[i] = 2 * puteri[i-1];
}
void eulerTree(int node ,int& index)
{
vizitat[node] = true;
euler[index++] = node;
for(auto e : adj[node])
{
if(!vizitat[e])
{
low[e] = index - 1;
height[e] = height[node] + 1;
eulerTree(e, index);
euler[index++] = node;
}
}
}
int main()
{
cin>>n >> q;
adj.resize(n+1);
for(int i = 2;i<=n;i++)
{
int x;
cin>>x;
adj[x].push_back(i);
}
int index = 1;
preCalc2();
eulerTree(1, index);
index--;
for(int i = 1;i <= index; i++) rmq[0][i] = euler[i];
for(int e = 1; e<=18;e++)
{
for(int i = 1; i<=index;i++)
{
int j = puteri[e-1] + i;
rmq[e][i] = rmq[e-1][i];
if(j<=index && rmq[e-1][i] > rmq[e-1][j])
rmq[e][i] = rmq[e-1][j];
}
}
for(int e = 0; e<=18;e++)
{
for(int i = 1; i<=index;i++)
{
cout<<rmq[e][i]<<" ";
}
cout<<'\n';
}
/*for(int i = 1;i<=index;i++) cout<<euler[i]<<" ";
cout<<'\n';
for(int i = 1;i<=n;i++) cout<<low[i]<<" ";-*/
}