Cod sursa(job #1701206)

Utilizator Athena99Anghel Anca Athena99 Data 12 mai 2016 14:17:56
Problema Atac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("atac.in");
ofstream fout("atac.out");

const int inf= 1<<30;
const int nmax= 32000;
const int logmax= 16;

int n, m, p, k;

bool u[nmax+1];
int l[nmax*2+1], e[nmax*2+1], lvl[nmax+1], ind[nmax+1], d[nmax*2+1][logmax+1];
int v[nmax+1], nr[nmax+1][logmax+1], o[nmax+1][logmax+1];

struct str {
    int x, y;
};

vector <str> g[nmax+1];

inline str mp( int x, int y ) {
    str sol;
    sol.x= x, sol.y= y;

    return sol;
}

void dfs( int x ) {
    u[x]= 1;
    e[++k]= x;
    for ( vector <str>::iterator it= g[x].begin(); it!=g[x].end(); ++it ) {
        if ( u[(*it).x]==0 ) {
            lvl[(*it).x]= lvl[x]+1;
            v[(*it).x]= (*it).y;
            nr[(*it).x][0]= (*it).x, nr[(*it).x][1]= x;
            o[(*it).x][0]= v[(*it).x], o[(*it).x][1]= min(v[(*it).x], v[x]);
            for ( int p= 1; (1<<p)<=lvl[(*it).x]+1; ++p ) {
                nr[(*it).x][p]= nr[nr[nr[(*it).x][p-1]][1]][p-1];
                o[(*it).x][p]= min(o[(*it).x][p-1], o[nr[nr[(*it).x][p-1]][1]][p-1]);
            }
            dfs((*it).x);
            e[++k]= x;
        }
    }
}

int query( int a, int b ) {
    int x= min(ind[a], ind[b]), y= max(ind[a], ind[b]), k= 0;
    for ( int p= 1; p*2<=y-x+1; p*= 2, ++k ) ;

    if ( l[d[x][k]]<l[d[y-(1<<k)+1][k]] ) {
        return e[d[x][k]];
    } else {
        return e[d[y-(1<<k)+1][k]];
    }
}

int get_min( int x, int y ) {
    int ans= inf;
    for ( int step= logmax; step>=0; --step ) {
        if ( lvl[x]-(1<<step)+1>=lvl[y]+1 ) {
            ans= min(ans, o[x][step]);
            x= nr[x][step];
            if ( step>0 ) {
                ++step;
            }
        }
    }

    return ans;
}

int main(  ) {
    fin>>n>>m>>p;
    for ( int i= 1, x, y; i<=n-1; ++i ) {
        fin>>x>>y;
        g[x].push_back(mp(i+1, y));
        g[i+1].push_back(mp(x, y));
    }

    nr[1][0]= 1;
    dfs(1);
    for ( int i= 1; i<=k; ++i ) {
        d[i][0]= i;
        l[i]= lvl[e[i]];
        if ( ind[e[i]]==0 ) {
            ind[e[i]]= i;
        }
    }

    for ( int j= 1; (1<<j)<=k; ++j ) {
        for ( int i= 1; i+(1<<j)-1<=k; ++i ) {
            if ( l[d[i][j-1]]<l[d[i+(1<<(j-1))][j-1]] ) {
                d[i][j]= d[i][j-1];
            } else {
                d[i][j]= d[i+(1<<(j-1))][j-1];
            }
        }
    }

    int x, y, a, b, c, d, z, lca;
    fin>>x>>y>>a>>b>>c>>d;
    lca= query(x, y);
    z= min(get_min(x, lca), get_min(y, lca));
    if ( z==inf ) {
        z= 0;
    }
    for ( int cnt= 2; cnt<=m; ++cnt ) {
        x= (x*a+y*b)%n+1;
        y= (y*c+z*d)%n+1;
        lca= query(x, y);
        z= min(get_min(x, lca), get_min(y, lca));
        if ( z==inf ) {
            z= 0;
        }

        if ( cnt>=m-p+1 ) {
            fout<<z<<"\n";
        }
    }

    return 0;
}