Cod sursa(job #1818912)

Utilizator antanaAntonia Boca antana Data 29 noiembrie 2016 22:34:57
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <cstdio>
#include <algorithm>
#define MAXN 32000
#define LOG 16
#define INF 0x3f3f3f3f

int r, n, m, p, lg[MAXN+1], str[LOG][MAXN+1], mini[LOG][MAXN+1], lista[MAXN+1], val[MAXN+1], nxt[MAXN+1], cost[MAXN+1], d[MAXN+1], h[MAXN+1];
bool viz[MAXN+1];

inline int minim(int a, int b){
    return (a < b ? a : b);
}

inline void adauga(int x, int y, int z)
{
    val[++r] = y;
    nxt[r] = lista[x];
    cost[r] = z;
    lista[x] = r;
}

void dfs(int nod)
{
    int p;

    viz[nod] = 1;
    p = lista[nod];

    while(p)
    {
        if(!viz[val[p]])
        {
            d[val[p]] = cost[p];
            str[0][val[p]] = nod;
            mini[0][val[p]] = minim(d[val[p]], d[nod]);
            h[val[p]] = h[nod] + 1;

            dfs(val[p]);
        }
        p = nxt[p];
    }
}

void stramosi()
{
    int i, log;

    for(log=1; (1<<log)<=n; ++log)
        for(i=1; i<=n; ++i){
            str[log][i] = str[log-1][str[log-1][i]];
            mini[log][i] = minim(mini[log-1][i], mini[log-1][str[log-1][i]]);
        }
}

inline int query(int x, int y)
{
    if(x == y)
        return 0;

    int m = INF, pas;

    if(h[x] < h[y])
        std::swap(x, y);

    pas = lg[h[x]-h[y]];

    if(h[x] != h[y]){
        for(; pas>=0; --pas)
            if(h[str[pas][x]] > h[y])
            {
                m = minim(m, mini[pas][x]);
                x = str[pas][x];
            }

        if(str[0][x] == y)
            return m;
        else
        {
            m = minim(m, mini[0][x]);
            x = str[0][x];
        }
    }

    for(pas = lg[n]; pas>=0; --pas)
        if(str[pas][x] != str[pas][y])
        {
            m = minim(m, minim(mini[pas][x], mini[pas][y]));
            x = str[pas][x];
            y = str[pas][y];
        }

    m = minim(m, minim(d[x], d[y]));

    return m;
}

int main()
{
    freopen("atac.in", "r", stdin);
    freopen("atac.out", "w", stdout);

    int i, x, y, X, Y, A, B, C, D, Z;

    scanf("%d%d%d", &n, &m, &p);

    lg[2] = 1;
    for(i=3; i<=n; ++i)
        lg[i] = lg[i/2] + 1;

    for(i=2; i<=n; ++i)
    {
        scanf("%d%d", &x, &y);
        adauga(i, x, y);
        adauga(x, i, y);
    }

    scanf("%d%d%d%d%d%d", &X, &Y, &A, &B, &C, &D);

    h[1] = 1;
    dfs(1);
    stramosi();

    for(i=1; i<=m; ++i)
    {
        Z = query(X, Y);

        if(i >= m-p+1)
            printf("%d\n", Z);

        X = (X*A + Y*B) % n + 1;
        Y = (Y*C + Z*D) % n + 1;
    }

    return 0;
}