Pagini recente » Cod sursa (job #3305709) | Cod sursa (job #3346014) | Cod sursa (job #3332298) | Cod sursa (job #3353799) | Cod sursa (job #3344864)
#include <fstream>
#include <vector>
#define NMAX 32002
using namespace std;
ifstream fin("atac.in");
ofstream fout("atac.out");
int N,M,P,X,Y,A,B,C,D,Z,nivel[NMAX],tata[NMAX],up[NMAX][17],cost[NMAX];
vector<pair<int,int>> tree[NMAX];
void citire()
{
fin>>N>>M>>P;
int val;
for(int i=2; i<=N; i++)
{
fin>>tata[i]>>val;
tree[tata[i]].push_back({i,val});
}
fin>>X>>Y>>A>>B>>C>>D;
}
void DFS(int nod)
{
for(int i=0; i<tree[nod].size(); i++)
{
int next_nod=tree[nod][i].first;
int drum=tree[nod][i].second;
nivel[next_nod]=nivel[nod]+1;
cost[next_nod]=drum;
DFS(next_nod);
}
}
int distrugere_drum(int x, int y)
{
if(x==y)
{
return 0;
}
int ans=100000000;
while(x!=y)
{
if(nivel[x]>=nivel[y])
{
ans=min(ans,cost[x]);
x=tata[x];
}
else
{
ans=min(ans,cost[y]);
y=tata[y];
}
}
return ans;
}
int main()
{
citire();
DFS(1);
Z=distrugere_drum(X,Y);
if(P==M)
{
fout<< Z << "\n";
}
for(int i=2; i<=M; i++)
{
X=(long long)(X*A+Y*B)%N+1;
Y=(long long)(Y*C+Z*D)%N+1;
Z=distrugere_drum(X,Y);
if(M-P+1<=i)
{
fout<< Z << "\n";
}
}
return 0;
}