Pagini recente » Istoria paginii runda/luca_oji4/clasament | Cod sursa (job #448946) | Cod sursa (job #989864) | Istoria paginii runda/splunge1/clasament | Cod sursa (job #221285)
Cod sursa(job #221285)
#include <cstdio>
#include <vector>
using namespace std;
const int MAX_N = 250010;
const int MAX_L = 18;
int n, m;
int par[MAX_N][MAX_L];
vector <int> f[MAX_N];
void df(int x)
{
int i, l = f[x].size(), j, nod;
for (j = 1, nod = par[x][0]; nod && x; nod = par[nod][j - 1], ++j)
if (par[nod][j - 1]) par[x][j] = par[nod][j - 1];
for (i = 0; i < l; ++i)
{
par[f[x][i]][0] = x;
df(f[x][i]);
}
}
void find(int x, int y)
{
int i, bit = 1 << 17;
for (i = MAX_L - 1; i >= 0; --i, bit >>= 1)
if (y & bit) x = par[x][i];
printf("%d\n", x);
}
int main()
{
int i, x, y;
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
scanf("%d %d", &n , &m);
for (i = 1; i <= n; ++i)
{
scanf("%d", &par[i][0]);
f[par[i][0]].push_back(i);
}
df(0);
for (i = 1; i <= m; ++i)
{
scanf("%d %d", &x, &y);
find(x, y);
}
}