Pagini recente » Cod sursa (job #379365) | Cod sursa (job #1564702) | Cod sursa (job #136287) | Cod sursa (job #3271003) | Cod sursa (job #1341588)
#include<fstream>
#include<vector>
using namespace std;
typedef int var;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const var MAXN = 250001;
const var MAXM = 300001;
//var PARENT[MAXN];
//var B[MAXN];
var D[MAXN], PARENTP[MAXN], P[MAXM], ANS[MAXM];
vector<bool> VIZ(MAXN);
vector<var> QIND[MAXN];
vector<var> G[MAXN];
void solveQueries(var node) {
for(vector<var>::iterator it = QIND[node].begin(); it != QIND[node].end(); ++it) {
var &qind = *it;
var &ans = ANS[qind];
if(D[node] < P[qind]) {
ans = 0;
} else {
ans = PARENTP[D[node]-P[qind]];
}
}
}
var t=0;
var dfs(var node) {
VIZ[node] = 1;
//B[++t] = node;
PARENTP[D[node]] = node;
//Rezolv toate query-urile adresate lui node
solveQueries(node);
//Dupa df normal
for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
//if(!VIZ[*it]) {
D[*it] = D[node] + 1;
dfs(*it);
//}
}
}
int main() {
var n, m, p, q;
fin>>n>>m;
for(var i=1; i<=n; i++) {
fin>>p;
G[p].push_back(i);
}
for(var i=1; i<=m; i++) {
fin>>q>>P[i];
QIND[q].push_back(i);
}
for(var i=1; i<=n; i++) {
if(!VIZ[i]) {
dfs(i);
}
}
for(var i=1; i<=m; i++) {
fout<<ANS[i]<<'\n';
}
return 0;
}