Pagini recente » Cod sursa (job #2361935) | Cod sursa (job #2714357) | Cod sursa (job #1394442) | Cod sursa (job #746863) | Cod sursa (job #1969643)
#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#define FOR(i, n) for (int i = 1; i <= n; ++i)
#define iter vector<int>::iterator
#define N 250001
#define S_MAX 1 << 23
#define K 20
using namespace std;
bitset<N> E;
vector<int> L[N], S;
int V[K][N];
char STR[S_MAX];
void dfs(int node) {
E[node] = 1;
S.push_back(node);
for (iter it = L[node].begin(); it != L[node].end(); ++it)
dfs(*it);
int len = S.size();
for (int step = 1, k = 0; step < len; step <<= 1, ++k) {
V[k][node] = S[len - step - 1];
}
S.pop_back();
}
void read(int &x, char* &p) {
x = 0;
for (; *p < '0' || *p > '9'; ++p);
for (; *p >= '0' && *p <= '9'; ++p) {
x = 10 * x + *p - '0';
}
}
int main() {
FILE *f = fopen("stramosi.in", "r");
FILE *g = fopen("stramosi.out", "w");
fread(STR, 1, S_MAX, f);
char *ptr = STR;
int n, m;
read(n, ptr);
read(m, ptr);
FOR(i, n) {
int x;
read(x, ptr);
if (x)
L[x].push_back(i);
}
FOR(i, n) {
if (!E[i]) {
dfs(i);
}
}
while (m--) {
int node, p;
read(node, ptr);
read(p, ptr);
int step = 1;
for (int k = 0; V[k][node] > 0 && step <= p; step <<= 1, ++k)
if (step & p)
node = V[k][node];
fprintf(g, "%d\n", (step > p ? node : 0));
}
return 0;
}