Cod sursa(job #1257654)

Utilizator japjappedulapPotra Vlad japjappedulap Data 8 noiembrie 2014 00:36:37
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <vector>
using namespace std;

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

#define NZ 250004
#define MZ 300004

#define BUFFER 1<<17
char Pars[BUFFER], *p;

int GET();
void Check();

struct TP{
    int nr, sol;
};

int N, M, stk[NZ], Qry[MZ];
bool root[NZ], B[NZ];
vector <int> G[NZ];
vector <TP> Q[NZ];

void DFS(int t)
{
    vector <TP> :: iterator jt;
    vector <int> :: iterator it;

    stk[++stk[0]] = t;

    for (jt = Q[t].begin(); jt != Q[t].end(); ++jt)
        if (stk[0] <= (*jt).nr)
            Qry[(*jt).sol] = 0;
        else
            Qry[(*jt).sol] = stk[stk[0]-(*jt).nr];
    B[t] = 1;
    for (it = G[t].begin(); it != G[t].end(); ++it)
        if (B[*it] == 0)
            DFS(*it);

    --stk[0];
};

int main()
{
    p = Pars;
    N = GET(), M = GET();
    for (int i = 1, a; i <= N; ++i)
    {
        a = GET();
        if (a == 0) root[i] = 1;
        else G[a].push_back(i);
    }
    TP ct;
    for (int i = 1, nod; i <= M; ++i)
    {
        nod = GET();
        ct.nr = GET();
        ct.sol = i;
        Q[nod].push_back(ct);
    }
    for (int i = 1; i <= N; ++i)
        if (root[i])
            DFS(i);
    for (int i = 1; i <= M; ++i)
        os << Qry[i] << '\n';
}

int GET()
{
    while (*p < '0' || *p > '9') ++p, Check();
    int X = 0;
    while (*p >= '0' && *p <= '9') X = X*10 + (*p-'0'), ++p, Check();
    return X;
};

void Check()
{
    if (*p == '\0') is.get(Pars, BUFFER, '\0'), p = Pars;
};