Pagini recente » Borderou de evaluare (job #156670) | Cod sursa (job #1906007) | Cod sursa (job #2145065) | Cod sursa (job #1941324) | Cod sursa (job #66751)
Cod sursa(job #66751)
#include <cstdio>
#include <vector>
#include <deque>
#define maxn 427222
#define maxm 422222
#define pb push_back
#define sz size()
using namespace std;
int n, m;
int tata[maxn];
int st[maxn];
bool viz[maxn];
vector< vector<int> > a;
vector< vector<int> > A;
vector< vector<int> > sol;
int q[maxn];
int T[maxn][3];
int t;
int poz[maxn];
void citire()
{
freopen("stramosi.in", "r", stdin);
scanf("%d %d\n", &n, &m);
int i;
for(i=1;i<=n;i++) scanf("%d ", &tata[i]);
A.reserve(n+1);
a.reserve(n+1);
sol.reserve(n+1);
A.resize(n+1);
a.resize(n+1);
sol.resize(n+1);
for(i=1;i<=m;i++)
{
int xx, yy;
scanf("%d %d\n", &xx, &yy);
q[xx]++;
// A[xx].pb(yy);
T[++t][1]=xx;
T[t][2]=yy;
}
for(i=1;i<=n;i++)
{
a[i].reserve(q[i]);
A[i].reserve(q[i]);
sol[i].reserve(q[i]);
}
for(i=1;i<=m;i++) A[T[i][1]].pb(T[i][2]);
for(i=1;i<=n;i++) if(tata[i])a[tata[i]].pb(i);
}
void dfs(int nod, int k)
{
//printf("%d\n",nod);
int i;
st[k]=nod;
viz[nod]=1;
for(i=0;i<A[nod].sz;i++)
if(k-A[nod][i]<1) sol[nod].pb(0);
else sol[nod].pb(st[k-A[nod][i]]);
for(i=0;i<a[nod].sz;i++)
if(!viz[a[nod][i]])
dfs(a[nod][i], k+1);
}
int main()
{
int i, j;
citire();
for(i=1;i<=n;i++) if(!tata[i]) dfs(i, 1);
freopen("stramosi.out", "w", stdout);
for(i=1;i<=m;i++)
{
printf("%d\n", sol[T[i][1]][poz[T[i][1]]++]);
}
return 0;
}