Pagini recente » Cod sursa (job #601136) | Cod sursa (job #2048910) | Cod sursa (job #1148156) | Cod sursa (job #2907694) | Cod sursa (job #391872)
Cod sursa(job #391872)
#include <fstream>
#include <vector>
#include <bitset>
#define maxm 1<<19
#define maxn 230000
#define pb push_back
#define sz size
using namespace std;
ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
struct stiva { int nod, level; };
stiva stf [maxm];
int N, M, i, p, q , a, cap, node, lev;
int st [maxm];
vector <int> listv [maxm];
vector <int> listp [maxm], G [maxm];
int sol [maxm], fat [maxm];
bool viz [maxm];
void dfs () {
//diz iz da sou
int j;
while (1) {
node = stf [cap].nod;
lev = stf [cap].level;
//for (j = 1; j <= cap; j++) fout << stf [j].nod << "\n";
viz [node] = true;
st [lev] = node;
if (!cap) return;
else --cap ;
for (j = 0; j < listv [node].sz (); j++)
if (lev > listv [node][j]) sol [listp [node][j]] = st [lev - listv [node][j]];
for (j = 0; j < G [node].sz (); j++)
if (!viz [G [node][j]]) {
++cap;
stf [cap].nod = G [node][j];
stf [cap].level = lev + 1;
}
}
}
int main () {
int a;
fin >> N >> M;
for (i = 1; i <= N; i++) {
fin >> a;
fat [i] = a;
G [a].pb (i);
}
for (i = 1; i <= M; i++)
{
fin >> q >> p;
listv [q].pb (p);
listp [q].pb (i);
}
for (i = 1; i <= N; i++)
if (!fat [i]) {
cap = 1;
stf [cap].level = 1;
stf [cap].nod = i;
dfs ();
}
for (i = 1; i <= M; i++) fout << sol [i] << "\n";
return 0;
}