Cod sursa(job #1950040)

Utilizator BugirosRobert Bugiros Data 2 aprilie 2017 17:19:01
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
using namespace std;

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

const int MAXN = 250005;
const int MAXM = 300003;

int n,m;

struct intrebare
{
    int id;
    int p;
};

vector<intrebare> intrebarinod[MAXN];

vector<int> fii[MAXN];

vector<int> radacini;

void citire()
{
    in >> n >> m;
    for (int i = 1;i <= n;++i)
    {
        int tata;
        in >> tata;
        if (tata == 0)
            radacini.push_back(i);
        else fii[tata].push_back(i);
    }
    for (int i = 1;i <= m;++i)
    {
        int p,q;
        in >> q >> p;
        intrebarinod[q].push_back((intrebare){i,p});
    }
}

int stiva[MAXN];
int indice_fiu[MAXN];
int l_stiva;

int rasp_intrebari[MAXM];

void dfs(int radacina)
{
    stiva[l_stiva = 1] = radacina;

    while(l_stiva >= 1)
    {
        int nod = stiva[l_stiva];
        if (indice_fiu[nod] == -1)//nu am calculat intrebarile lui nod
            for (unsigned int i = 0;i < intrebarinod[nod].size();++i)
            {
                int id = intrebarinod[nod][i].id;
                int p = intrebarinod[nod][i].p;
                if (l_stiva - p < 1)
                    rasp_intrebari[id] = 0;
                else rasp_intrebari[id] = stiva[l_stiva - p];
            }

        ++indice_fiu[nod];
        if (indice_fiu[nod] < fii[nod].size())
            stiva[++l_stiva] = fii[nod][indice_fiu[nod]];
        else --l_stiva;
    }
}

void afisare()
{
    for (int i = 1;i <= m;++i)
        out << rasp_intrebari[i] << '\n';
}

int main()
{
    citire();
    for (int i = 1;i <= n;++i)
        indice_fiu[i] = -1;
    for (unsigned int i = 0;i < radacini.size();++i)
        dfs(radacini[i]);
    afisare();
    return 0;
}