Cod sursa(job #189)

Utilizator blasterzMircea Dima blasterz Data 6 decembrie 2006 11:46:47
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#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;
}