Pagini recente » Cod sursa (job #1143905) | Cod sursa (job #547061) | Cod sursa (job #612615) | Cod sursa (job #495163) | Cod sursa (job #640792)
Cod sursa(job #640792)
using namespace std;
#include <cstdio>
#include <vector>
#define DIM 8192
#define maxn 300001
vector < int > G[250001];
vector < pair<int, int > > Q[250001];
char ax[DIM+16];
int pz;
inline void cit(int &x)
{
x=0;
while(ax[pz]<'0' || ax[pz]>'9')
if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
while(ax[pz]>='0' && ax[pz]<='9')
{
x=x*10+ax[pz]-'0';
if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
}
}
int n,m;
bool use[250001];
int TT[250001];
int sol[300001];
int st[250001];
void read()
{
int i,p,q;
freopen("stramosi.in","r",stdin);
//scanf("%d %d\n",&n, &m);
cit(n);cit(m);
for(i=1;i<=n;++i)
{
//scanf("%d ", &p);
cit(p);
TT[i]=p;
G[p].push_back(i);
}
for(i=1;i<=m;++i)
{
//scanf("%d %d\n", &p,&q);
cit(p);cit(q);
Q[p].push_back( make_pair(q,i));
}
}
inline void dfs(int n, int k)
{
use[n]=1;
st[k]=n;
for(unsigned int i = 0; i<Q[n].size(); i++)
if(k >= Q[n][i].first)
sol[Q[n][1].second]=st[k-Q[n][i].first];
for(vector <int>::iterator it=G[n].begin(); it!=G[n].end(); it++)
if(!use[*it])
dfs(*it,k+1);
}
void solve()
{int i;
for(i=1;i<=n;++i)
if(!TT[i])
dfs(i, 0);
for(i=1;i<=m;++i)printf("%d\n", sol[i]);
}
int main()
{
read();
solve();
return 0;
}