Cod sursa(job #1473300)

Utilizator Liviu98Dinca Liviu Liviu98 Data 18 august 2015 23:37:42
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#define NMax 250001
#define MMax 300001
using namespace std;
int D[NMax],tata[NMax],P[MMax],Sol[MMax],N,M,x;
vector<int> Graf[NMax],Q[NMax];
bool uz[NMax];

void Solve(int nod)
{
        for(vector<int>::iterator it=Q[nod].begin();it!=Q[nod].end();it++)
        {
            int &sol1=Sol[*it];
            if(D[nod]<P[*it])
                sol1=0;
            else
                sol1=tata[D[nod]-P[*it]];
        }


}

void DFS(int nod)
{
    uz[nod]=true;
    tata[D[nod]]=nod;
    Solve(nod);
    for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
        if(uz[*it]==false)
        {
            D[*it]=D[nod]+1;
            DFS(*it);
        }
}

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",&x);
        Graf[x].push_back(i);
    }

    for(int i=1;i<=M;i++)
    {
        scanf("%d%d",&x,&P[i]);
        Q[x].push_back(i);
    }

    for(int i=1;i<=N;i++)
        if(!uz[i])
        DFS(i);

    for(int i=1;i<=M;i++)
        printf("%d\n",Sol[i]);


}