Pagini recente » Cod sursa (job #3235059) | Cod sursa (job #986649) | Cod sursa (job #1954922) | Cod sursa (job #625422) | Cod sursa (job #1205694)
#include <fstream>
using namespace std;
struct nod
{
int urm,cost;
nod *adr;
};
typedef nod *lda1;
lda1 lda[32005];
int n,m,p,x,y,z,a,b,c,d;
int peuler[130005],inl[130005],pra[32005],trecut[32005],nr;
int rmq[130005][20],put[20],pa[130005];
int rmq2[32005][20][2],hnod[32005],lista[32005],nr2;
int v1,v2,cmasc,dif;
void parc(int nod,int h)
{
trecut[nod]=1; hnod[nod]=h;
++nr; peuler[nr]=nod; inl[nr]=h; if (pra[nod]==0) pra[nod]=nr;
for (lda1 p=lda[nod];p!=0;p=p->adr)
{
if (trecut[p->urm]==0)
{
parc(p->urm,h+1);
++nr; peuler[nr]=nod; inl[nr]=h;
}
}
}
void parc2 (int nod,int h,int cost)
{
trecut[nod]=1;
lista[h]=nod;
rmq2[nod][0][0]=cost; rmq2[nod][0][1]=lista[h-1];
for (int i=1;i<20;++i)
{
if (put[i]<h)
{
rmq2[nod][i][0]=rmq2[nod][i-1][0];
if (rmq2[lista[h-put[i-1]]][i-1][0]<rmq2[nod][i][0]) rmq2[nod][i][0]=rmq2[lista[h-put[i-1]]][i-1][0];
rmq2[nod][i][1]=lista[h-put[i]];
}
}
for (lda1 p=lda[nod];p!=0;p=p->adr)
{
if (trecut[p->urm]==0)
{
parc2(p->urm,h+1,p->cost);
}
}
}
int main()
{
ifstream in ("atac.in");
ofstream out ("atac.out");
in>>n>>m>>p;
for (int i=2;i<=n;++i)
{
in>>x>>y;
lda1 p=new nod;
p->urm=x;
p->cost=y;
p->adr=lda[i];
lda[i]=p;
p=new nod;
p->urm=i;
p->cost=y;
p->adr=lda[x];
lda[x]=p;
}
in>>x>>y>>a>>b>>c>>d;
parc(1,1);
put[0]=1; for (int i=1;i<20;++i) put[i]=put[i-1]*2;
pa[0]=0; for (int i=1;i<130005;++i) { pa[i]=pa[i-1]; if (put[pa[i]+1]==i) pa[i]++; }
for (int i=nr;i>0;--i)
{
rmq[i][0]=i;
for (int j=1;j<20;++j)
{
if(i+put[j]-1<=nr)
{
rmq[i][j]=rmq[i][j-1];
if (inl[rmq[i+put[j-1]][j-1]]<inl[rmq[i][j]]) rmq[i][j]=rmq[i+put[j-1]][j-1];
}
}
}
for (int i=1;i<=n;++i) trecut[i]=0;
parc2(1,1,0);
for (int i=1;i<=m;++i)
{
if (x!=y)
{
v1=pra[x],v2=pra[y],cmasc,dif;
if (v1>v2) { int t=v1; v1=v2; v2=t; }
dif=v2-v1+1;
cmasc=rmq[v1][pa[dif]];
if (inl[rmq[v2-put[pa[dif]]+1][pa[dif]]]<inl[cmasc]) cmasc=rmq[v2-put[pa[dif]]+1][pa[dif]];
cmasc=peuler[cmasc];
z=0;
dif=hnod[x]-hnod[cmasc];
int v=x;
while (dif>0)
{
if (z==0 || rmq2[v][pa[dif]][0]<z) z=rmq2[v][pa[dif]][0];
v=rmq2[v][pa[dif]][1];
dif=dif-put[pa[dif]];
}
dif=hnod[y]-hnod[cmasc];
v=y;
while (dif>0)
{
if (z==0 || rmq2[v][pa[dif]][0]<z) z=rmq2[v][pa[dif]][0];
v=rmq2[v][pa[dif]][1];
dif=dif-put[pa[dif]];
}
}else
{
z=0;
}
if (i>m-p) out<<z<<"\n";
x=(x*a+y*b)%n+1;
y=(y*c+z*d)%n+1;
}
in.close();
out.close();
return 0;
}