Cod sursa(job #1501834)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 13 octombrie 2015 21:19:06
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define DIM 300010
using namespace std;

int Father[DIM], Answer[DIM], Stack[DIM];
vector <int> List[DIM]; int X, Y, N, M;
vector <pair <int, int> > Query[DIM];

void DFS (int node, int pos)
{
    Stack[pos] = node;

    vector <pair <int, int> > :: iterator it1;
    for (it1 = Query[node].begin(); it1 != Query[node].end(); it1 ++)
    {
        pair <int, int> vec = *it1;
        Answer[vec.first] = Stack[max(0, pos - vec.second)];
    }

    vector <int> :: iterator it2;
    for (it2 = List[node].begin(); it2 != List[node].end(); it2 ++)
    {
        int vec = *it2;
        DFS (vec, pos + 1);
    }

    return;
}

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", &Father[i]);
        List[Father[i]].push_back(i);
    }

    for (int i = 1; i <= M; i ++)
    {
        scanf("%d %d", &X, &Y);
        Query[X].push_back(make_pair(i, Y));
    }

    DFS(0, 0);

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

    fclose (stdin );
    fclose (stdout);

    return 0;
}