Cod sursa(job #1147643)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 20 martie 2014 00:06:39
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define Mmax 300005
#define Nmax 250005

using namespace std;

pair< pair<int,int>,int> Questions[Mmax];
vector<int> G[Nmax];
vector<int> stak; /// simulam stiva

int answer[Mmax];
int N,Q,pz;

void read()
{
    int x;
    scanf("%d%d",&N,&Q);
    for(int i = 1; i <= N; ++i)
    {
        scanf("%d",&x);
        G[x].push_back(i);
    }
    for(int i = 1; i <= Q; ++i)
    {
        Questions[i].second = i;
        scanf("%d%d",&Questions[i].first.first,&Questions[i].first.second);
    }
    sort(Questions+1,Questions+Q+1);
}

void DFS(int k)
{
    stak.push_back(k);
    if(k){
        pz = lower_bound(Questions+1,Questions+Q+1,make_pair(make_pair(k,0),0)) - Questions;
        while(Questions[pz].first.first == k)
        {
            int y = (stak.size() - Questions[pz].first.second);
            if(y > 1)
                answer[Questions[pz].second] = stak[y - 1];
            ++pz;
        }
    }
    for(int it = 0; it < G[k].size(); ++ it)
        DFS(G[k][it]);
    stak.pop_back();
}

void solve()
{
    DFS(0);
    for(int i = 1; i <= Q; ++i)
        printf("%d\n",answer[i]);
}

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

    read();
    solve();

    return 0;
}