Pagini recente » Cod sursa (job #994767) | Clasament iconcurs20 | Cod sursa (job #587599) | Cod sursa (job #2202849) | Cod sursa (job #1225311)
#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 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);
for(int i = 0; i < A[t].size(); ++i) {
int p = b.size() - 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 < b.size())
val = b[p];
A[t][i].answer = 0;//val;
}
for(int i = 0; i < a[t].size(); ++i)
if(!use[a[t][i]])
dfs(a[t][i]);
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;
}