Cod sursa(job #221284)

Utilizator raduzerRadu Zernoveanu raduzer Data 15 noiembrie 2008 14:20:12
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#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; 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);
    } 
}