Pagini recente » Cod sursa (job #1384074) | Cod sursa (job #2806749) | Cod sursa (job #1906189) | Cod sursa (job #189619) | Cod sursa (job #774235)
Cod sursa(job #774235)
#include<vector>
#include<fstream>
#include<stack>
#include<queue>
#define maxn 500010
#define pb push_back
using namespace std;
bool uz[maxn];
vector<int>a[maxn];
vector<int>query[maxn];
vector<int>ans[maxn];
vector<int>tati;
stack< pair<int,int> > q;
pair<int, int> aux;
int st[maxn],cnt[maxn];
int vec[maxn];
ifstream in("stramosi.in");
ofstream out("stramosi.out");
int n,m;
void read()
{
in>>n>>m;
int x,y;
for(int i=1;i<=n;i++)
{
in>>x;
if(x>0)
a[x].pb(i);
else tati.pb(i);
}
for(int i=1;i<=m;i++)
{
in>>x>>y;
query[x].pb(y);
vec[i]=x;
}
}
void dfs(int nod)
{
int niv=1;
q.push(make_pair(nod,1));
while(!q.empty())
{
aux=q.top();
nod=aux.first;
niv=aux.second;
st[niv]=nod;
uz[nod]=1;
for(int i=0;i<query[nod].size();i++)
{
if(niv-query[nod][i]>0) ans[nod].pb(st[niv-query[nod][i]]);
else ans[nod].pb(0);
}
int ok=1;
for(int i=0;i<a[nod].size();i++)
if(uz[a[nod][i]]==0)
{
ok=0;
aux.first=a[nod][i];
aux.second=niv+1;
q.push(aux);
break;
}
if(ok==1) q.pop();
}
}
int main()
{
read();
for(int i=0;i<tati.size();i++)
dfs(tati[i]);
for(int i=1;i<=m;i++)
{
int x=vec[i];
out<<ans[x][cnt[x]]<<"\n";
cnt[x]++;
}
}