Pagini recente » Cod sursa (job #1334018) | Cod sursa (job #649739) | Cod sursa (job #2922855) | Clasament oni_4 | Cod sursa (job #957709)
Cod sursa(job #957709)
#include <cstdio>
#include <vector>
#define MAXN 300001
using namespace std;
int i, N, M, Q, P, Head, a, n;
int st[MAXN], Answer[MAXN];
struct nod {int QA, position;}var, now;
vector <int> v[MAXN], start;
vector <nod> p[MAXN];
bool used[MAXN];
inline void DFS(int node) {
used[node] = true;
st[++Head] = node;
if (p[node].size() != 0) {
for (i = 0; i < p[node].size(); ++i) {
now.position = p[node][i].position;
if (Head - p[node][i].QA <= 0) now.QA = 0;
else
now.QA = st[Head - p[node][i].QA];
Answer[now.position] = now.QA;
}
}
vector <int> :: iterator it, fin;
it = v[node].begin(); fin = v[node].end();
for (; it != fin; ++it)
if (!used[*it])
DFS(*it);
--Head;
}
int main() {
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d%d", &N, &M);
for (i = 1; i <= N; ++i) {
scanf("%d", &a);
if (a == 0) start.push_back(i);
else {
v[a].push_back(i);
v[i].push_back(a);
}
}
for (; M > 0; --M) {
scanf("%d%d", &Q, &P);
var.QA = P; var.position = ++n;
p[Q].push_back(var);
}
vector <int> :: iterator f;
for (f = start.begin(); f != start.end(); ++f)
if (!used[*f])
DFS(*f);
for (i = 1; i <= n; ++i)
printf("%d\n", Answer[i]);
return 0;
}