Cod sursa(job #1225352)

Utilizator blasterzMircea Dima blasterz Data 2 septembrie 2014 14:14:20
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <vector>
#define N 300001

using namespace std;

int n, m;
int parent[N];
vector<int> a[N];

vector<pair<int, int> > A[N];

int node[N], question[N];
int stack[N], ns;
bool use[N];
int pos[N];

void dfs(int u) {
    use[u] = true;
    stack[ns++] = u;
    
    for (vector<pair<int, int> > ::iterator it = A[u].begin(); it != A[u].end(); ++it) {
        int p = ns - it->first - 1;
        if (p >= 0 && p < ns)
            it->second = stack[p];
    }
    
    for (vector<int>::iterator it = a[u].begin(); it != a[u].end(); ++it)
        if (!use[*it])
            dfs(*it);
    --ns;
}

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

    scanf ("%d %d\n", &n, &m);
    int i;
    for (i = 1; i <= n; ++i) {
        scanf ("%d ", &parent[i]);
        if (parent[i])
            a[ parent[i] ].push_back(i);
    }
    
    for (i = 1; i <= m; ++i) {
        scanf ("%d %d\n", &node[i], &question[i]);
        A[ node[i] ].push_back( make_pair(question[i], 0) );
    }

    for (i = 1; i <= n; ++i)
        if (!parent[i])
            dfs(i);
    
    for (i = 1; i <= m; ++i)
        printf ("%d\n", A[ node[i] ][ pos[ node[i] ]++ ].second);
}