Cod sursa(job #880344)

Utilizator SmarandaMaria Pandele Smaranda Data 16 februarie 2013 17:14:22
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>

using namespace std;

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

const long N = 250000, M = 300000;
long t [N], q [N], h1 [M], h2 [M];
bool used [N];
vector <long> s [N], af [N], v [N];

void read (long &n, long &m) {
    long i, p, q;
    in >> n >> m;
    for (i = 0; i < n; i ++) {
        in >> t [i];
        t [i] --;
        if (t [i] != -1)
            v [t [i]].push_back (i);
    }
    for (i = 0; i < m; i ++) {
        in >> q >> p;
        q --;
        s [q].push_back (p);
        h1 [i] = q;
        h2 [i] = p;
    }
}

long dfs (long node, long poz) {
    long u, p;
    u = p = 0;
    vector <long> :: iterator it;
    q [poz] = node;
    used [node] = true;
    for (it = s [node].begin (); it != s [node].end (); ++it)
        if (poz - (*it) >= 0)
            af [node].push_back (q [poz - (*it)] + 1);
        else af [node].push_back (0);
    for (it = v [node].begin (); it != v [node].end (); ++ it)
        if (used [*it] == false)
            dfs (*it, poz + 1);
}

void solve (const long &n, const long &m) {
    long i, l, j;
    vector <long> :: iterator it, jt;
    for (i = 0; i < n; i ++)
        if (t [i] == -1) {
            dfs (i, 0);
        }
    for (i = 0; i < m; i ++) {
        j = h1 [i];
        for (it = s [j].begin (), jt = af [j].begin (); it != s [j].end (); ++it, ++jt)
            if ((*it) == h2 [i]) {
                out << (*jt) << "\n";
                break;
            }
    }
}

int main () {
    long n, m;

    read (n, m);
    solve (n, m);
    return 0;
}