Cod sursa(job #1323327)

Utilizator japjappedulapPotra Vlad japjappedulap Data 20 ianuarie 2015 22:24:04
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
using namespace std;

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

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

int GET();
void Check();

const int N = 250010, M = 300010;

struct Lista {
    int q, ind;
};

int n, m;
int st [N], ans [M], t [N];
bool used [N];
vector <Lista> L [N];
vector <int> graph [N];

inline void dfs (int x)
{
    int a;
    vector <int> :: iterator it;
    vector <Lista> :: iterator jt;

    st [++ st [0]] = x;
    for (jt = L [x].begin (); jt != L [x].end (); ++ jt) {
        a = st [0] - (*jt).q;
        if (a <= 0)
            ans [(*jt).ind] = 0;
        else ans [(*jt).ind] = st [a];
    }
    used [x] = 1;
    for (it = graph [x].begin (); it != graph [x].end (); ++it)
        if (!used [*it])
            dfs (*it);
    st [0] --;
}

int main ()
{
    p = Pars;
    int i, q, x;
    Lista temp;

    n = GET(), m = GET();
    for (i = 1; i <= n; i ++)
    {
        t[i] = GET();
        graph [t[i]].push_back(i);
    }
    for (i = 1; i <= m; i ++)
    {
        x = GET();
        temp.q = GET();
        temp.ind = i;
        L[x].push_back(temp);
    }
    for (i = 1; i <= n; i ++)
        if (t [i] == 0) {
            st [0] = 0;
            dfs (i);
        }
    for (i = 1; i <= m; i ++)
        os << ans[i] << '\n';
    return 0;
}

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;
};