Cod sursa(job #1229476)

Utilizator gerd13David Gergely gerd13 Data 17 septembrie 2014 15:23:28
Problema Lacate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <deque>
#include <stack>

using namespace std ;

const int NMAX = 350005 ;
const int QMAX = 400005 ;
const int INF = 0x3f3f3f3f ;

ifstream cin("stramosi.in") ;
ofstream cout("stramosi.out") ;

void READ() ;
void OUT() ;
void DFS(int) ;



vector <int> G[NMAX] ;
vector <pair <int, int > > D[NMAX] ;

int raspuns[QMAX], st[NMAX] ;
int N, M,  Varf;

inline void READ()
{
    cin >> N >> M ;

    for(int i = 1 ; i <= N ; ++ i)
    {

      int x ;
      cin >> x ;
      G[x].push_back(i) ;

    }

    for(int i = 1 ; i <= M ; ++ i)
    {
        int  A, B;
        cin >> A >> B ;
        D [A].push_back(make_pair(B, i)) ;
    }

}




 void DFS(int K)
{
    st[ ++ Varf] = K ;

    for(vector <pair <int, int> > ::iterator it  = D[K].begin() ; it != D[K].end() ; ++ it)
    {
        int pozitia_stramosului = it->first ;
        int nr_intrebare = it->second ;

        if(Varf - pozitia_stramosului >= 1)
            raspuns [ nr_intrebare] = st[Varf - pozitia_stramosului] ;

        else raspuns [nr_intrebare] = 0 ;

    }

    for(vector <int> ::iterator it = G[K].begin() ; it != G[K].end() ; ++ it)
        DFS(*it) ;

    st[ Varf --] = 0 ;

}





inline void OUT()
{

    for(int i = 1 ; i <= M ; ++ i)
    {
        cout << raspuns[i] << '\n' ;
    }
}

int main()
{
    READ() ;
    DFS(0) ;
    OUT() ;

    cin.close() ;
    cout.close() ;
    return  0 ;
}