Cod sursa(job #2071661)

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

using namespace std;

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

const int Nmax = 250005;
const int Mmax = 300005;

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

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

int stiva[Nmax], rez[Mmax];

void DFS (int nod)
{
    for (int i = 0; i < query[nod].size(); i++)
    {
        int first = query[nod][i].first;
        int second = query[nod][i].second;

        if (nr > query[nod][i].first)
            rez[query[nod][i].second] = stiva[nr - query[nod][i].first];
        else
            rez[query[nod][i].second] = 0;
    }

    for (int 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();
        nr = 1;
        stiva[nr] = curent;

        DFS(curent);
        arbore.pop();
    }

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

    return 0;
}