Cod sursa(job #1226104)

Utilizator blasterzMircea Dima blasterz Data 4 septembrie 2014 16:21:23
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <vector>
#define N 300001

using namespace std;

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

struct nod {
    int q, a;
    nod(){};
    nod(int _q, int _a) { q = _q; a = _a; }
};

vector<nod> 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;
    
    int n = A[u].size();
    for (int i = 0; i < n; ++i) {
        int p = ns - A[u][i].q - 1;
        if (p >= 0 && p < ns)
            A[u][i].a = 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( nod(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] ]++ ].a);
}