Pagini recente » Cod sursa (job #2682034) | Cod sursa (job #521124) | Cod sursa (job #235789) | Cod sursa (job #1558744) | Cod sursa (job #1225318)
#include <cstdio>
#include <vector>
#include <cassert>
#define N 350001
#define M 400001
using namespace std;
struct nod{
int question, answer;
nod(){};
nod(int q, int a){
question = q;
answer = a;
}
};
vector<nod> A[M];
vector<int> a[N];
//vector<int> b;
int b[M], K;
int node[M], k[M], p[M], n, m;
bool used[N], use[N];
void read(){
scanf("%d %d ", &n, &m);
int x;
for(int i = 1; i <= n; ++i){
scanf("%d ", &x);
if(x)
a[x].push_back(i);
else
used[i] = 1;
}
for(int i = 1; i <= m; ++i){
scanf("%d %d ", &node[i], &k[i]);
A[node[i]].push_back(nod(k[i], 0));
}
}
void dfs(int t){
use[t] = true;
//b.push_back(t);
b[K++] = t;
int i;
for(i = 0; i < A[t].size(); ++i) {
int p = K - A[t][i].question - 1;
//fprintf (stderr, "%d : %d %d\n", p, b.size(), A[t][i].question);
//assert(p < b.size());
int val = 0;
if (p >= 0 && p < K)
val = b[p];
if (i < A[t].size())
A[t][i] = nod(A[t][i].question, val);//val;
}
for(i = 0; i < a[t].size(); ++i)
if(!use[a[t][i]])
dfs(a[t][i]);
--K;
//b.pop_back();
}
void solve(){
for(int i = 1; i <= n; ++i)
if(used[i]){
dfs(i);
}
for(int i = 1; i <= m; ++i)
printf("%d\n", A[node[i]][p[node[i]]++].answer);
}
int main(){
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
read();
solve();
return 0;
}