Cod sursa(job #392795)

Utilizator KrillKnossisKuchiki Byakuya KrillKnossis Data 8 februarie 2010 12:23:28
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream.h>
ifstream f ("stramosi.in");
ofstream g ("stramosi.out");
int v[300005],i,j,n,m,x,y,s[300005],d[300005],q,r[300005],k,zx;
 
  struct nod
  {
      int info;
      nod *urm;
  }*a[300005],*p;
   
  struct nod2
  {
      int info,rez;
      nod2 *urm;
  }*b[300005],*z;
   
    
    void df (int x)
    {
        k=1;
        v[k]=x;
         
        z=b[x];
        while (z)
        {
            zx=k-z->info;
            if (zx>0)
            z->rez=v[zx];
            else
                z->rez=0;
            z=z->urm;
       }
         
        while (k)
        {
            y=v[k];
            if (a[y])
            {
                y=a[y]->info;
                a[v[k]]=a[v[k]]->urm;
                k++;
                v[k]=y;
                 
                 
                 
                z=b[y];
                while (z)
                {
                  zx=k-z->info;
                    if (zx>0)
                        z->rez=v[zx];
                     else
                        z->rez=0;
                     z=z->urm;
                }
            }
            else
                k--;
        }
    }
 
 
 
int main ()
{
   f>>n>>m;
    for (i=1;i<=n;i++)
    {
        f>>x;
        if (x==0)
        {
            q++;
            r[q]=i;
        }
        else
       {
        p=new nod;
        p->info=i;
        p->urm=a[x];
        a[x]=p;
        }
    }
     
    for (i=1;i<=m;i++)
        f>>s[i]>>d[i];
     
    for (i=m;i>=1;i--)
    {
        z=new nod2;
        z->info=d[i];
        z->urm=b[s[i]];
        b[s[i]]=z;
    }
 
     
    for (j=1;j<=q;j++)
        df (r[j]);
     
    for (i=1;i<=m;i++)
    {
        g<<b[s[i]]->rez<<"\n";
        b[s[i]]=b[s[i]]->urm;
    }
    return 0;
}