Cod sursa(job #1257643)

Utilizator japjappedulapPotra Vlad japjappedulap Data 8 noiembrie 2014 00:19:56
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <vector>
using namespace std;

#define NZ 250004
#define nr first
#define sol second

int N, M, stk[NZ], K, Qry[NZ+50000];

vector <int> G[NZ];
vector <int> :: iterator it;

vector <pair<int,int> > Q[NZ];
vector <pair<int,int> > :: iterator jt;

bool root[NZ], B[NZ];

void DFS(int x);

int main()
{
    freopen ("stramosi.in", "r", stdin);
    freopen ("stramosi.out", "w", stdout);
    scanf ("%d%d", &N, &M);
    for (int i = 1, a; i <= N; ++i)
    {
        scanf("%d", &a);
        if (a == 0) root[i] = 1;
        else G[a].push_back(i);
    }
    for (int i = 1, nod, tr; i <= M; ++i)
    {
        scanf("%d%d", &nod, &tr);
        Q[nod].push_back({tr, i});
    }
    for (int i = 1; i <= N; ++i)
        if (root[i])
            DFS(i);
    for (int i = 1; i <= M; ++i)
        printf("%i\n", Qry[i]);
}


void DFS(int t)
{
    vector <pair<int,int> > :: iterator jt;
    vector <int> :: iterator it;

    B[t] = 1;
    stk[++K] = t;
    if (Q[t].empty() == 0)
        for (jt = Q[t].begin(); jt != Q[t].end(); ++jt)
            if (K <= (*jt).nr) Qry[(*jt).sol] = 0;
            else Qry[(*jt).sol] = stk[K-(*jt).nr];
    for (it = G[t].begin(); it != G[t].end(); ++it)
        if (B[*it] == 0)
            DFS(*it);
    --K;
};