Pagini recente » Cod sursa (job #638034) | Cod sursa (job #1981307) | Cod sursa (job #2224950) | Cod sursa (job #1990460) | Cod sursa (job #1490064)
// 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;
}