Cod sursa(job #977408)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 25 iulie 2013 20:26:38
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <vector>

#include <cstdio>
using namespace std;

const int MAX_N = 250002;
const int MAX_M = 300002;

int N, M, Nr;
int F[MAX_N], st[MAX_N], ans[MAX_M];
vector < int > v[MAX_N];
vector < pair < int, int > > Q[MAX_N];

inline void DFS(int x) {
    st[++Nr] = x;
    for(size_t j = 0; j < Q[x].size(); ++j)
        if(Q[x][j].first >= Nr)
            ans[Q[x][j].second] = 0;
        else ans[Q[x][j].second] = st[Nr-Q[x][j].first];
    for(size_t j = 0; j < v[x].size(); ++j)
        DFS(v[x][j]);
    --Nr;
}

int main() {
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for(int i = 1; i <= N; ++i) {
        scanf("%d", &F[i]);
        v[F[i]].push_back(i);
    }

    for(int i = 1, x, k; i <= M; ++i) {
        scanf("%d %d", &x, &k);
        Q[x].push_back(make_pair(k, i));
    }
    for(int i = 1; i <= N; ++i)
        if(!F[i])
            DFS(i);

    for(int i = 1; i <= M; ++i)
        printf("%d\n", ans[i]);

    fclose(stdin);
    fclose(stdout);

    return 0;
}