Cod sursa(job #1858242)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 27 ianuarie 2017 10:53:16
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <vector>
#include <stack>

using namespace std;

int euler[250005];
vector <int> v[250005];

struct thing{
    int ancestor, id;
};

int ans[300005];
vector <thing> Q[300005];
stack < pair<int, int> > s;
int cnt = -1;

int main()
{
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);
    int n,q,x,y,i;
    scanf("%d %d", &n, &q);
    for(i = 1;i <= n;i++){
        scanf("%d", &x);
        v[x].push_back(i);
    }
    thing ax;
    for(i = 1;i <= q;i++){
        scanf("%d %d", &x, &y);
        ax.ancestor = y;
        ax.id = i;
        Q[x].push_back(ax);
    }
    s.push({0, 0});
    while(s.empty() == false){
        int node = s.top().first;
        int depth = s.top().second;
        euler[depth] = node;
        s.pop();
        for(auto it : Q[node]){
            ans[it.id] = euler[depth - it.ancestor];
        }
        for(auto it : v[node]){
            s.push({it, depth + 1});
        }
    }
    for(i = 1;i <= q;i++){
        printf("%d\n", ans[i]);
    }
    return 0;
}