Cod sursa(job #959835)

Utilizator dunhillLotus Plant dunhill Data 8 iunie 2013 23:38:06
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#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) {
    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)
		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);
    }
    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) {
		DFS(*f); break;
	}
    for (i = 1; i <= n; ++i)
        printf("%d\n", Answer[i]);
    return 0;
}