Cod sursa(job #1635928)

Utilizator BrandonChris Luntraru Brandon Data 6 martie 2016 20:58:14
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define NMAX 250005
#define QMAX 300005
using namespace std;

ifstream cin("stramosi.in");
ofstream cout("stramosi.out");

class Query {
public:
    int val, pos;
};

vector <int> G[NMAX], stk;
vector <Query> query[QMAX], ans;

int father[NMAX], n, q;
bool used[NMAX];

inline bool cmp(Query a, Query b) {
    return a.pos < b.pos;
}

void dfs(int node) {
    used[node] = true;
    stk.push_back(node);

    for(auto qry: query[node]) {
        ans.push_back({(stk.size() > qry.val) ? stk[stk.size() - qry.val - 1] : 0, qry.pos});
    }

    for(auto nxt: G[node]) {
        if(used[nxt]) {
            continue;
        }

        dfs(nxt);
        stk.pop_back();
    }
}

void offline() {
    for(int i = 1; i <= q; ++i) {
        int node, nr;
        cin >> node >> nr;
        query[node].push_back({nr, i});
    }

    dfs(0);
    sort(ans.begin(), ans.end(), cmp);

    for(auto it: ans) {
        cout << it.val << '\n';
    }
}

void online() {

}

int main() {
    cin >> n >> q;

    for(int i = 1; i <= n; ++i) {
        cin >> father[i];
        G[father[i]].push_back(i);
    }

    offline();
    return 0;
}