Pagini recente » Cod sursa (job #2970929) | Cod sursa (job #846798) | Cod sursa (job #2706700) | Cod sursa (job #3225797) | Cod sursa (job #1969613)
#include <cstdio>
#include <iostream>
#define FOR(i, n) for (int i = 1; i <= n; ++i)
#define iter vector<int>::iterator
#define N 250001
#define S_MAX 1 << 23
using namespace std;
char E[N];
int V[N][18];
int S[N], A[N], *L[N], D[N], *NB[N];
char STR[S_MAX];
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';
}
}
//void dfs(int node) {
//// cout << "recursion stack at node = " << node << "\n";
// E[node] = 1;
// S[++S[0]] = node;
// for (int *it = L[node]; *it != -1; ++it)
// dfs(*it);
// int len = S[0];
// for (int step = 1, k = 0; step < len; step <<= 1, ++k) {
// V[node].push_back(S[len - step]);
// }
// --S[0];
//}
void nonRecDfs(int node) {
S[1] = node;
NB[1] = L[node];
int h = 1;
while (h > 0) {
node = S[h];
int *it = NB[h];
++NB[h];
if (*it != -1) {
S[++h] = *it;
NB[h] = L[*it];
} else {
for (int step = 1, k = 0; step < h; step <<= 1, ++k)
V[node][k] = S[h - step];
E[node] = 1;
--h;
}
}
}
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);
++D[x];
A[i] = x;
}
FOR(i, n) {
L[i] = new int[D[i] + 1];
L[i][D[i]] = -1;
D[i] = 0;
}
FOR(i, n) {
if (A[i])
L[A[i]][D[A[i]]++] = i;
}
FOR(i, n) {
if (!E[i])
nonRecDfs(i);
}
while (m--) {
int node, p;
read(node, ptr);
read(p, ptr);
int step = 1;
for (int k = 0; V[node][k] > 0 && step <= p; step <<= 1, ++k)
if (step & p)
node = V[node][k];
fprintf(g, "%d\n", (step > p ? node : 0));
}
return 0;
}