Cod sursa(job #1489998)

Utilizator roadtojediWilly Fog roadtojedi Data 22 septembrie 2015 16:32:59
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
// Problema Stramosi O ( N + M )
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

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

void dfs(int nod){
    stiva.push_back(nod);
    uz[nod] = 1;
    for(auto it = Queries[nod].begin(); it != Queries[nod].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[nod].begin(); it != G[nod].end(); it++){
            if(!uz[*it])
                dfs(*it);
    }
    stiva.pop_back();
}

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});
    }
    for(i = 1 ; i <= n; i++)
        if(!uz[i])
        dfs(i);

    for(i = 1; i <= m; i++)
        g<<raspuns[i]<<"\n";
    return 0;
}