Pagini recente » Cod sursa (job #2670341) | Cod sursa (job #1540954) | Cod sursa (job #2199930) | Cod sursa (job #2447542) | Cod sursa (job #880344)
Cod sursa(job #880344)
#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;
}