Cod sursa(job #979170)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 31 iulie 2013 22:07:46
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<stack>

#define x first
#define y second
#define NMAX 250007
#define MMAX 300007

using namespace std;

vector <int> v[NMAX];
vector <pair<int, int> > B[NMAX];
int n, m, a[NMAX], sol[MMAX], Stack[NMAX];

inline void dfs(int u){
    Stack[++ Stack[0]] = u;
    for(int i = 0; i < B[u].size(); ++ i)
        if(B[u][i].x >= Stack[0])
            sol[B[u][i].y] = 0;
        else
            sol[B[u][i].y] = Stack[Stack[0] - B[u][i].x];
    for(int i = 0; i < v[u].size(); ++ i)
        dfs(v[u][i]);
    -- Stack[0];
}

int main(){
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++ i){
        scanf("%d", &a[i]);
        v[a[i]].push_back(i);
    }
    for(int i = 1; i <= m; ++ i){
        int aa = 0, bb = 0;
        scanf("%d %d", &aa, &bb);
        B[aa].push_back(make_pair(bb, i));
    }
    for(int i = 1; i <= n; ++ i)
        if(!a[i])
            dfs(i);
    for(int i = 1; i <= m; ++ i)
        printf("%d\n", sol[i]);
    return 0;
}