Cod sursa(job #2071694)

Utilizator papinub2Papa Valentin papinub2 Data 20 noiembrie 2017 21:43:32
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int N_max = 250005;
const int M_max = 300005;

int n, m, x, q, p, nr, curent;

queue <int> arbore;
vector <int> A[N_max];
vector <pair<int, int>> query[N_max];

int stiva[N_max], rez[M_max];

void DFS (int nod)
{
    for (auto i = 0; i < query[nod].size(); i++)
        if (nr > query[nod][i].first)
            rez[query[nod][i].second] = stiva[nr - query[nod][i].first];

    for (auto i = 0; i < A[nod].size(); i++)
    {
        stiva[++nr] = A[nod][i];
        DFS(A[nod][i]);
    }

    nr--;
}

int main()
{
    in >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        in >> x;

        if (x == 0)
            arbore.push(i);
        else
            A[x].push_back(i);
    }

    for (int i = 1; i <= m; i++)
    {
        in >> q >> p;

        query[q].push_back(make_pair(p, i));
    }

    while (!arbore.empty())
    {
        curent = arbore.front();
        arbore.pop();
        nr = 1;
        stiva[nr] = curent;

        DFS(curent);
    }

    for (int i = 1; i <= m; i++)
        out << rez[i] << '\n';

    return 0;
}