Cod sursa(job #2206171)

Utilizator memecoinMeme Coin memecoin Data 21 mai 2018 16:07:00
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <math.h>
 
using namespace std;

#define MAXN 250005
#define MAXLOGN 20

int n, m;

int parents[MAXLOGN][MAXN];

int query(int x, int depth) {
	if (x == 0) {
		return 0;
	}
	if (depth == 0) {
		return x;
	}

	int index = 0;

	while (parents[index + 1][x] != -1 && (depth - (1 << (index + 1))) > 0) {
		index++;
	}

	return query(parents[index][x], depth - (1 << index));
}

int log2(int n) {
	int result = 0;
	while (n > 0) {
		n /= 2;
		result++;
	}
	return result;
}

int main() {
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);

	memset(parents, -1, sizeof(parents));

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; ++i) {
		scanf("%d", &parents[0][i]);
	}

	int logn = log2(n);

	for (int k = 1; k < logn; ++k) {
		for (int i = 1; i <= n; ++i) {
			parents[k][i] = parents[k - 1][parents[k - 1][i]];
		}
	}

	int x, depth;

	for (int i = 0; i < m; ++i) {
		scanf("%d %d", &x, &depth);
		printf("%d\n", query(x, depth));
	}

	return 0;
}