Pagini recente » Cod sursa (job #140314) | Cod sursa (job #754032) | Cod sursa (job #1774717) | Cod sursa (job #1609301) | Cod sursa (job #1489998)
// 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;
}