Cod sursa(job #168526)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 31 martie 2008 16:21:16
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 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,b[32001],c[17][65000],cost[32001][10001],ji,nr,nl,leg[32001][10001],a[17][65000],n,m,i,j,k,l,p,at[32001],viz[32001];
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]];
  for(pp=niv[x]-niv[sc]-(1<<k),n=x;pp;pp-=b[pp])
   n=sm[b[pp]][n];
  if(ll>cc[k][x])
   ll=cc[k][x];
  if(ll>cc[k][n])
   ll=cc[k][n];
  }
  if(y-sc){
 k=b[niv[y]-niv[sc]];
  for(pp=niv[y]-niv[sc]-(1<<k),n=y;pp;pp-=b[pp])
   n=sm[b[pp]][n];
  if(ll>cc[k][y])
   ll=cc[k][y];
  if(ll>cc[k][n])
   ll=cc[k][n];
  }
  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;
}