Cod sursa(job #404264)

Utilizator mihaionlyMihai Jiplea mihaionly Data 25 februarie 2010 23:11:06
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
using namespace std;
ifstream f("atac.in");
ofstream g("atac.out");
#define nmax 40001
//#define eu (eu-1)
#define min(a,b) ((a<b)?(a):(b))
#define max(a,b) ((a>b)?(a):(b))
bool viz[nmax],viz2[nmax];
int eu[1000000],n,m,p,l,Cs[nmax];
int poz[nmax],tata[nmax];
int lv[nmax],lca,niv;
int X,Y,A,B,C,D,Z;
struct arbore { int c,x;arbore *urm;};
arbore *Ar[nmax];
struct{int x,i;} I[1<<16];
void add(arbore *&a,int x,int c)
 {
 arbore *ar=new arbore;
 ar->x=x;
 ar->c=c;
 ar->urm=a;
 a=ar;
 }
void read()
 {
 f>>n>>m>>p;
 int i,u,v;
 for(i=2;i<=n;++i)
  {
  f>>u>>v;
  add(Ar[u],i,v);
  add(Ar[i],u,v);
  }
 f>>X>>Y>>A>>B>>C>>D;
 }
int cost(int nod1,int nod2)
 {
 for(arbore *p=Ar[nod1];p!=NULL;p=p->urm)
  {
  if(p->x==nod2)
   return p->c;
  }
 return 0;
 }
void dfs(int t,int nod,int level)
 {
 eu[++l]=nod;
 tata[nod]=t;
 Cs[nod]=cost(nod,t);
 lv[l]=level;
 if(!viz2[nod])
  {
  viz2[nod]=true;
  poz[nod]=l;
  }
 viz[nod]=true;
 for(arbore *a=Ar[nod];a!=NULL;a=a->urm)
  {
  if(!viz[a->x])
   {
   dfs(nod,a->x,level+1);
   eu[++l]=nod;
   lv[l]=level;
   }
  }
 }
void intervale(int i,int x,int y)
 {
 if(x==y)
  {
  I[i].x=lv[x];
  I[i].i=x;
  }
 else
  {
  int mij=(x+y)/2;
  intervale(2*i,x,mij);
  intervale(2*i+1,mij+1,y);
  I[i].x=min(I[2*i].x,I[2*i+1].x);
  if(I[i].x==I[2*i].x)
   I[i].i=I[2*i].i;
  else
   I[i].i=I[2*i+1].i;
  }
 }
void query1(int i,int c1,int c2,int x,int y)
 {
 if(c1>=x&&c2<=y)
  {
  if(niv>I[i].x)
   {
   niv=I[i].x;
   lca=I[i].i;
   }
  return;
  }
 int mij=(c1+c2)/2;
 if(x<=mij)
  query1(2*i,c1,mij,x,y);
 if(mij<y)
  query1(2*i+1,mij+1,c2,x,y);
 }
void findz()
 {
 int zmin=nmax,i;
 for(i=X;i!=lca;i=tata[i])
  if(zmin>Cs[i]) zmin=Cs[i];
 for(i=Y;i!=lca;i=tata[i])
  if(zmin>Cs[i]) zmin=Cs[i];
 Z=zmin;
 }
void solve()
 {
 intervale(1,1,l);
 int i;
 for(i=1;i<=m;i++)
  {
  niv=nmax;
  query1(1,1,l,min(poz[X],poz[Y]),max(poz[X],poz[Y]));
  lca=eu[lca];
  findz();
  X=(X*A+Y*B)%n+1;
  Y=(Y*C+Z*D)%n+1;
  if(i>m-p)
   g<<Z<<endl;
  }
 }
int main()
 {
 read();
 dfs(0,1,1);
 solve();
 return 0;
 }