Cod sursa(job #189274)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 13 mai 2008 07:49:21
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include<stdio.h>   
struct nod{   
long v;   
long b;   
nod *next;   
};   
nod *vec[32001];   
long n,m,p,j,k,i,niv[32001],dad[32001][17],bom[32001][17],
aa,bb,cc,dd,xx,yy,zz;   
void pune();   
void df(long ii, long nn);   
void stramosi();
void atac();
long dady(long oo,long nn);
long bomm(long oo,long nn);
int main()
{       freopen("atac.in","rt",stdin);
        freopen("atac.out","wt",stdout);
        scanf("%ld%ld%ld",&n,&m,&p);   
        for(i=2;i<=n;i++)   
        {  scanf("%ld%ld",&j,&k);   
           pune();   
         }   
         niv[1]=1;   
         df(1,1);   
         stramosi();   
         scanf("%ld%ld%ld%ld%ld%ld",&xx,&yy,&aa,&bb,&cc,&dd);   
         for(;m>p;m--)   
         {   atac();
             xx=(xx*aa+yy*bb)%n+1;
             yy=(yy*cc+zz*dd)%n+1;
         }   
         for(;m;m--)   
         {   atac();
             printf("%ld\n",zz);
             xx=(xx*aa+yy*bb)%n+1;
             yy=(yy*cc+zz*dd)%n+1;
         }   
         return 0;
}
void pune()   
{     nod *paux;   
        paux=new nod;   
        paux->v=j;   
        paux->b=k;   
        paux->next=(vec[i])?vec[i]:0;   
        vec[i]=paux;   
         paux=new nod;   
        paux->v=i;   
        paux->b=k;   
        paux->next=(vec[j])?vec[j]:0;   
        vec[j]=paux;   
}   
void df(long ii, long nn)   
{       nod *paux;   
        for(paux=vec[ii];paux;paux=paux->next)   
          if(!niv[paux->v])   
            {  niv[paux->v]=nn+1;   
                dad[paux->v][0]=ii;   
                bom[paux->v][0]=paux->b;   
                df(paux->v,nn+1);   
             }   
}   
void stramosi()   
{       long lc,lnc,coada[32001],b1,b2,t1,t2;   
        lc=n-1;   
        for(i=1;i<=lc;i++) coada[i]=i+1;   
        lnc=0;   
        for(i=1;lc;i++)   
        {  for(j=1;j<=lc;j++)   
            {   k=coada[j];   
                t1=dad[k][i-1]; t2=dad[t1][i-1];   
                if(t2)   
                {  dad[k][i]=t2;   
                   coada[++lnc]=k;   
                   b1=bom[k][i-1];   
                   b2=bom[t1][i-1];   
                   bom[k][i]=(b1<b2)?b1:b2;   
                 }   
             }   
            lc=lnc;   
            lnc=0;   
         }   
}   
long dady(long oo,long nn)
{       long oc=oo;
        for(j=16;j>=0;j--)
          if((niv[oo]-nn)&(1<<j))oc=dad[oc][j];
        return oc;
}
long bomm(long oo,long nn)
{
        long oc=oo,bomb=100001;
        for(j=16;j>=1;j--)
        { if((niv[oo]-nn)&(1<<j))
           { bomb=(bomb<bom[oc][j])?bomb:bom[oc][j];
             oc=dad[oc][j];
           }
        }
        return bomb;
}
void atac()
{       long st,dr,mi,nt,d1,d2,b1,b2;
        if(xx==yy) {zz=0;return;}
        st=1;dr=(niv[xx]<niv[yy])?niv[xx]:niv[yy];
        if(dady(xx,dr)==dady(yy,dr))nt=dr;
        else
        { while(dr-st>1)
                { mi=(st+dr)>>1;
                  d1=dady(xx,mi);
                  d2=dady(yy,mi);
                  if(d1==d2)st=mi;
                  else dr=mi;
                }
          nt=st;
        }
        b1=bomm(xx,nt);b2=bomm(yy,nt);
        zz=(b1<b2)?b1:b2;
}