Cod sursa(job #2644110)

Utilizator claudiu.gatinaFMI Claudiu Gatina claudiu.gatina Data 23 august 2020 14:50:21
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#define MMAX 300001
#define NMAX 250002

using namespace std;

int answers[MMAX];
int level[NMAX];
int n, m;


struct Query
{
    int degree;
    int ord;

    Query(int _deg, int _ord) : degree(_deg), ord(_ord) {}
};

struct Node
{
    vector<Query> queries;
    vector<int> descendants;
} nodes[NMAX];

void read()
{
    cin >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        int parent;
        cin >> parent;
        nodes[parent].descendants.push_back(i);
    }

    for(int i = 0; i < m; ++i)
    {
        int p, q;
        cin >> q >> p;

        nodes[q].queries.push_back(Query(p, i));
    }
}

void solve(int node, int depth)
{
    level[depth] = node;

    Node & currentNode = nodes[node];
    for(int i = 0; i < currentNode.queries.size(); ++i)
    {
        Query & currentQuery = currentNode.queries[i];
        answers[currentQuery.ord] = level[depth - currentQuery.degree];
    }

    for(int i = 0; i < currentNode.descendants.size(); ++i)
    {
        solve(currentNode.descendants[i], depth + 1);
    }
}

void printAnswers()
{
    for(int i = 0; i < m; ++i)
        cout << answers[i] << '\n';
}

int main() {
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);

    read();
    solve(0, 0);
    printAnswers();

    return 0;
}