Cod sursa(job #196695)

Utilizator blasterzMircea Dima blasterz Data 28 iunie 2008 10:19:16
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
   #include <cstdio>  
   #include <vector>  
   #include <deque>  
   #define maxn 527222  
   #define maxm 522222   
   #define pb push_back  
   #define sz size()  
   using namespace std;  
#define DIM 8192
   
   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];
  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;
    }
}
    
  void citire()  
  {  
    freopen("stramosi.in", "r", stdin);  
    //cit(n);cit(m);
   
    scanf("%d %d\n", &n, &m);  
    int i;  
    for(i=1;i<=n;i++) /*cit(tata[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;  
        //cit(xx);cit(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;  
   }