Cod sursa(job #1147622)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 19 martie 2014 23:31:28
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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;

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)
{
    int pz;
    stak.push_back(k);
    if(k){
        pz = lower_bound(Questions+1,Questions+N+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(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        DFS(*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;
}