Cod sursa(job #2966344)

Utilizator antoniadutuDutu Antonia antoniadutu Data 17 ianuarie 2023 09:16:54
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n, m, v[250001][18], niv[250001];

int nivel (int x) {
	if (niv[x] > 0) {
    return niv[x];
  }
 
  if (v[x][0] == 0) {
    return 0;
  }
  
  niv[x] = 1 + nivel(v[x][0]);
  return niv[x];
}
int main () {

	fin >> n >> m;

	for (int i = 1; i <= n; i++) {
		fin >> v[i][0];
	}

	for (int j = 1; (1 << j) < n; j++) {
		for (int i = 1; i <= n; i++) {
			v[i][j] = v[v[i][j - 1]][j - 1];
		}
	}

	for (int i = 1; i <= n; i++) {
		nivel(i);
	}

	int x, y;
	for (int i = 1; i <= m; i++) {
		fin >> x >> y;

		int salt = niv[x] - y;
		int curent = niv[x];

		if (salt >= 0) {
			for (int j = 17; j >= 0; j--) {
				int putere = (1 << j);

				if (niv[x] - putere >= salt) {
					x = v[x][j];
				}
			}

			fout << x << '\n';
		} else {
			fout << 0 << '\n';
		}
	}

	return 0;
}