Cod sursa(job #1490064)

Utilizator roadtojediWilly Fog roadtojedi Data 22 septembrie 2015 18:15:10
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
// Problema Stramosi O ( N + M )
#include <iostream>
#include <vector>
#include <fstream>
#include <stack>
using namespace std;

const int NMax = 400000;
const int MMax = 400000;
int n, m ;
vector<int> G[NMax];
vector< pair<int, int> > Queries[MMax];
int raspuns[MMax], uz [NMax];
vector<int> stiva;

void dfs(int nod){
    stack<int> st;
    st.push(nod);
    while(!st.empty()){
        int current = st.top();
        if(uz[current]){
            st.pop();
            stiva.pop_back();
            continue;
        }
        stiva.push_back(current);
        uz[current] = 1;
        for(auto it = Queries[current].begin(); it != Queries[current].end(); ++it){
            if( (int)stiva.size() - it->first - 1 >= 0)
                raspuns[it->second] = stiva[ (int)stiva.size() - it->first - 1 ] ;
            else
                raspuns[it->second] = 0;
        }

        for(auto it = G[current].begin(); it != G[current].end(); it++){
                st.push(*it);
        }
    }

}

int main(){
    int i;
    ifstream f("stramosi.in");
    ofstream g("stramosi.out");
    f>>n>>m;
    int x;
    for(i = 1 ; i <= n; i++){
        f>>x;
        G[x].push_back(i);
    }
    int y;
    for(i = 1; i <= m; i++){
        f>>x>>y;
        Queries[x].push_back({y,i});
    }
    dfs(0);
    for(i = 1; i <= m; i++)
        g<<raspuns[i]<<"\n";
    return 0;
}