Cod sursa(job #170053)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 2 aprilie 2008 12:55:05
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<stdio.h>
#define min(a,b) ((a<=b)?a:b)
int niv[32001],mm,sm[17][32001],cc[17][32001],ppp,A,B,C,D,x,sc,y,z,ll,pp;
int b[32001],c[17][65000],cost[2001][1001],ji,nr,nl,leg[2001][1001],a[17][65000];
int n,m,i,j,k,l,p,at[32001],viz[32001],kk;
FILE *in,*out;

void def(int k){
int i,j,kk;
a[0][++nr]=++nl;viz[k]=1;c[0][nr]=k;niv[k]=nl;
if(!at[k])
 at[k]=nr;
for(i=1;i<=leg[k][0];i++)
  if(!viz[(kk=leg[k][i])]){
   sm[0][kk]=k;
   cc[0][kk]=cost[k][i];
   def(kk);
   a[0][++nr]=--nl;c[0][nr]=k;
  }
}

int main(){
in=fopen("atac.in","rt");
out=fopen("atac.out","wt");
fscanf(in,"%d%d%d",&n,&m,&ppp);
for(i=1;i<n;i++){
 fscanf(in,"%d%d",&l,&p);
 leg[i+1][++leg[i+1][0]]=l;
 leg[l][++leg[l][0]]=i+1;
 cost[i+1][leg[i+1][0]]=cost[l][leg[l][0]]=p;
}
nl=nr=0;
def(1);
b[1]=0;
ll=n;
n=nr;
for(i=2;i<=n;i++)
 b[i]=b[i>>1]+1;
for(i=1;i<=b[n];i++){
 l=n-(1<<i)+1;
  for(j=1;j<=l;j++)
    if(a[i-1][j]<=a[i-1][(ji=((j*2+(1<<i)-1)>>1)+1)])
     a[i][j]=a[i-1][j],c[i][j]=c[i-1][j];
    else
     a[i][j]=a[i-1][ji],c[i][j]=c[i-1][ji];
  for(j=1;j<=ll;j++){
   sm[i][j]=sm[i-1][sm[i-1][j]];
    if(cc[i-1][sm[i-1][j]]<=cc[i-1][j])
     cc[i][j]=cc[i-1][sm[i-1][j]];
    else
     cc[i][j]=cc[i-1][j];
  }
}
mm=ll;
fscanf(in,"%d%d%d%d%d%d",&x,&y,&A,&B,&C,&D);
for(i=1;i<=m;i++){
 l=at[x],p=at[y];
  if(l>p)
   k=l,l=p,p=k;
 k=b[p-l+1];
  if(a[k][l]<=a[k][(ji=p-(1<<k)+1)])
   sc=c[k][l];
  else
   sc=c[k][ji];
 ll=32000;
  if(x-sc){
   k=b[niv[x]-niv[sc]];pp=b[niv[x]-niv[sc]-(1<<k)];
   n=sm[k][x];ll=cc[k][x];
    while(n-sc){
      if(ll>cc[pp][n])
       ll=cc[pp][n];
     kk=n;
     n=sm[pp][n];
     pp=b[niv[kk]-niv[sc]-(1<<pp)];
    }
  }
  if(y-sc){
   k=b[niv[y]-niv[sc]];pp=b[niv[y]-niv[sc]-(1<<k)];;
   n=sm[k][y];
    if(ll>cc[k][y])
     ll=cc[k][y];
    while(n-sc){
      if(ll>cc[pp][n])
       ll=cc[pp][n];
     kk=n;
     n=sm[pp][n];
     pp=b[niv[kk]-niv[sc]-(1<<pp)];
    }
  }
  if(i>m-ppp)
   fprintf(out,"%d\n",ll);
 x=(x*A+y*B)%mm+1;
 y=(y*C+ll*D)%mm+1;
}
return 0;
}