Cod sursa(job #2491233)

Utilizator Dragos1226Dragos Chileban Dragos1226 Data 12 noiembrie 2019 08:13:10
Problema Atac Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#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;
}