Pagini recente » Cod sursa (job #388690) | Cod sursa (job #483850) | Cod sursa (job #1206365) | Cod sursa (job #2348865) | Cod sursa (job #1151919)
#include <stdio.h>
#include<vector>
using namespace std;
#define nmax 32005
#define nemax 4*nmax
#define pmax 25
#define inf 10005
struct element{int n,c;};
int n, m, P, i, b, c, nivv, ne, log, aux, loga, minim, x, y, a, dif, pz, rez, d, z;
vector <element> ma[nmax];
element el;
int niv[nmax], p[nemax], poz[nmax], lg[nemax];
int rmq[nemax][pmax], t[nmax][pmax], cmin[nmax][pmax];
void citire()
{
scanf("%ld %ld %ld",&n,&m,&P);
for (i=2;i<=n;i++)
{
scanf("%ld %ld",&b,&c);
el.n=b; el.c=c;
ma[i].push_back(el);
el.n=i;
ma[b].push_back(el);
}
}
void calculare(int x)
{
for (log=1;(1<<log)<=niv[x];log++)
{
t[x][log]=t[t[x][log-1]][log-1];
cmin[x][log]=cmin[x][log-1];
if(cmin[x][log]>cmin[t[x][log-1]][log-1])
cmin[x][log]=cmin[t[x][log-1]][log-1];
}
}
void dfs(int x)
{
vector<element>::iterator it;
p[++ne]=x;
if (poz[x]==0)
poz[x]=ne;
for (it=ma[x].begin();it!=ma[x].end();it++)
if(poz[(*it).n]==0)
{
t[(*it).n][0]=x;
cmin[(*it).n][0]=(*it).c;
niv[(*it).n]=niv[x]+1;
calculare((*it).n);
dfs((*it).n);
p[++ne]=x;
}
}
void calc_rmq()
{
for(i=1;i<=ne;i++)
{
rmq[i][0]=p[i];
if (i>1)
lg[i]=lg[i/2]+1;
}
for (log=1;(1<<log)<=ne;log++)
for (i=1;i+(1<<log)-1<=ne;i++)
{
rmq[i][log]=rmq[i][log-1];
if (niv[rmq[i+(1<<(log-1))][log-1]]<niv[rmq[i][log]])
rmq[i][log]=rmq[i+(1<<(log-1))][log-1];
}
}
int lca(int x, int y)
{
x=poz[x]; y=poz[y];
if(y<x)
{ aux=x; x=y; y=aux; }
loga=lg[y-x+1];
minim=rmq[x][loga];
if (niv[rmq[y-(1<<loga)+1][loga]]<niv[minim])
minim=rmq[y-(1<<loga)+1][loga];
return minim;
}
void calc_min(int x)
{
dif=niv[x]-niv[z]; pz=x;
for (loga=0;(1<<loga)<=dif;loga++)
if(((1<<loga)&dif)>0)
{
if (rez>cmin[pz][loga])
rez=cmin[pz][loga];
pz=t[pz][loga];
dif-=(1<<loga);
}
}
void rezolvare()
{
scanf("%ld %ld %ld %ld %ld %ld",&x,&y,&a,&b,&c,&d);
for (i=1;i<=m;i++)
{
z=lca(x,y);
//printf("%ld\n",z);
rez=inf;
calc_min(x);
calc_min(y);
if(i+P-1>=m)
printf("%ld\n",rez);
x=(x*a+y*b)%n+1;
y=(y*c+rez*d)%n+1;
}
}
int main()
{
freopen("atac.in","r",stdin);
freopen("atac.out","w",stdout);
citire();
niv[1]=1;
dfs(1);
calc_rmq();
rezolvare();
return 0;
}