Pagini recente » Cod sursa (job #2058723) | Cod sursa (job #2724235) | Cod sursa (job #1970055) | Cod sursa (job #1013700) | Cod sursa (job #2491233)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("atac.in");
ofstream out("atac.out");
const int NMax = 32000;
vector <int> G[NMax+5];
int N, M, P, X, Y, A, B, C, D, log[NMax+5], Anc[20][NMax+5], Min[20][NMax+5], Lvl[NMax+5];
void Read() {
in >> N >> M >> P;
for(int i = 2, x, y; i <= N; i++) {
in >> x >> y;
G[x].push_back(i);
Anc[0][i] = x;
Min[0][i] = y;
}
in >> X >> Y >> A >> B >> C >> D;
}
void DFS(int Nod) {
for(auto Vecin : G[Nod]) {
Lvl[Vecin] = Lvl[Nod] + 1;
DFS(Vecin);
}
}
void PreSolve() {
for (int i = 2; i <= N; i++)
log[i] = log[i/2] + 1;
for(int i = 1; (1<<i) <= N; i++)
for(int j = 1; j <= N; j++)
Anc[i][j] = Anc[i-1][Anc[i-1][j]];
for(int i = 1; (1<<i) <= N; i++)
for(int j = 1; j <= N; j++)
if(Anc[i][j])
Min[i][j] = min(Min[i-1][j], Min[i-1][Anc[i-1][j]]);
}
int LCA(int x, int y) {
if(Lvl[x] < Lvl[y])
swap(x,y);
while(Lvl[x] != Lvl[y]) {
int k = log[Lvl[x] - Lvl[y]];
x = Anc[k][x];
}
if(x==y) return x;
for (int k = log[Lvl[x]]; k >= 0; k--)
if(Anc[k][x] != Anc[k][y]){
x = Anc[k][x];
y = Anc[k][y];
}
return Anc[0][x];
}
int MinLCA(int lca,int nod) {
int p=Lvl[nod]-Lvl[lca];
int cost = 1e9;
while(p) {
int k = log[p];
p -= (1<<k);
cost = min(cost,Min[k][nod]);
nod = Anc[k][nod];
}
return cost;
}
void Solve() {
for(int i = M; i >= 1; i--){
int Sol = LCA(X,Y);cout << X << " " <<Y<< '\n';
Sol = min(MinLCA(Sol,X), MinLCA(Sol,Y));
if(i <= P)
out << Sol << '\n';
X = (X*A + Y*B) % N + 1;
Y = (Y*C + Sol*D) % N + 1;
}
}
int main() {
Read();
DFS(1);///pt level
PreSolve();///ancestor & min
Solve();///LCA
return 0;
}