Cod sursa(job #1225296)

Utilizator blasterzMircea Dima blasterz Data 2 septembrie 2014 13:27:45
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#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;
        //assert(p < b.size());
        A[t][i].answer = 0;
        if (p >= 0 && p < b.size())
            A[t][i].answer = b[p];
    }
    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;
}