Cod sursa(job #2644343)

Utilizator andu2006Alexandru Gheorghies andu2006 Data 24 august 2020 12:25:25
Problema Atac Scor 100
Compilator cpp-64 Status done
Runda prbd2 Marime 2.01 kb
#include<bits/stdc++.h>

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

const short NMAX = 32001;
int dp[NMAX][(int)log2(NMAX)+2],parent[NMAX][(int)log2(NMAX)+2],depth[NMAX],lg;
vector<pair<int,int>> edg[NMAX];
void dfs(int curr){
    for(auto it : edg[curr]){
        if(it.first!=parent[curr][0]){
            depth[it.first]=depth[curr]+1;
            parent[it.first][0]=curr;
            dp[it.first][0]=it.second;
            dfs(it.first);
        }
    }
}
int getMin(int u, int v){
    if(u==v)
        return 0;
    if(depth[u]<depth[v])
        swap(u,v);
    int du=depth[u],dv=depth[v],ans=INT_MAX;
    for(int i=lg;i>=0 && du>dv;i--){
        if(du-(1<<i)>=dv){
            ans=min(ans,dp[u][i]);
            u=parent[u][i];
            du-=(1<<i);
        }
    }
    if(u==v)
        return ans;
    for(int i=lg;i>=0;i--){
        if(parent[u][i]!=parent[v][i]){
            ans=min(ans,dp[u][i]);
            ans=min(ans,dp[v][i]);
            u=parent[u][i];
            v=parent[v][i];
            du-=(1<<i);
            dv-=(1<<i);
        }
    }
    return min(ans,min(dp[u][0],dp[v][0]));
}
int main()
{
    ios_base::sync_with_stdio(false); fin.tie(0); fout.tie(0);
    for(int i=0;i<NMAX;i++)
        for(int j=0;j<log2(NMAX)+1;j++)
            dp[i][j]=INT_MAX;
    int n,m,p,x,y,a,b,c,d;
    fin>>n>>m>>p;
    for(int i=2;i<=n;i++){
        int a,b;
        fin>>a>>b;
        edg[i].push_back({a,b});
        edg[a].push_back({i,b});
    }
    lg=log2(n)+1;
    dfs(1);
    for(int i=1;i<=lg;i++){
        for(int j=1;j<=n;j++){
            parent[j][i]=parent[parent[j][i-1]][i-1];
            dp[j][i]=min(dp[j][i-1],dp[parent[j][i-1]][i-1]);
        }
    }
    fin>>x>>y>>a>>b>>c>>d;
    for(int i=0;i<m;i++){
        cout<<x<<" "<<y<<'\n';
        int z=getMin(x,y);
        int newx=(x*a+y*b)%n+1,newy=(y*c+z*d)%n+1;
        if(i>=m-p){
            fout<<z<<'\n';
        }
        x=newx,y=newy;
    }
    return 0;
}