Cod sursa(job #1228555)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 14 septembrie 2014 16:07:34
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define Nmax 250105
#define Qmax 300105

using namespace std;

vector<int> G[Nmax]; /// graf
vector<pair<int,int> > bucket[Nmax]; /// intrebarile sortate
                            /// bucket[nod_curent].first -> al catalea stramos il caut
                            /// bucket[nod_curent].second -> numarul intrebarii
int qu[Qmax],st[Nmax];
int N,Q,VF;

void read()
{
    scanf("%d%d",&N,&Q);
    int t;
    for(int i = 1; i <= N; ++i)
    {
        scanf("%d",&t);
        G[t].push_back(i);
    }
    for(int i = 1; i <= Q; ++i)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        bucket[ a ].push_back(make_pair(b,i));
    }
}

void DFS( int k )
{
    st[++VF] = k;
    for(vector<pair<int,int> > ::iterator it = bucket[k].begin(); it != bucket[k].end(); ++it)
    {
        int poz = it->first, /// al catalea stramos
            nri = it->second; /// numarul intrebarii
        if(VF - poz >= 1) /// deci exista acest tata
            qu[ nri ] = st[VF - poz];
        else
            qu[ nri ] = 0;
    }
    for(vector<int> ::iterator it = G[k].begin(); it != G[k].end(); ++it)
        DFS(*it);

    st[VF--] = 0;

}

void print()
{
    for(int i = 1; i <= Q; ++i)
        printf("%d\n",qu[i]);
}

int main()
{
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);

    read();
    DFS(0);
    print();

    return 0;
}