Cod sursa(job #2644265)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 24 august 2020 09:27:53
Problema Atac Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("atac.in");
ofstream out("atac.out");
int r,n,m,p,lg[32001],str[16][32001],mini[16][32001],lista[32001],val[32001],nxt[32001],cost[32001],d[32001],h[32001];
bool viz[32001];


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]=min(mini[log-1][i], mini[log-1][str[log-1][i]]);
        }
}

int dfs(int nod)
{
    if(!h[nod])
        return dfs(str[0][nod]) + 1;
    return h[nod];
}

int query(int x,int y)
{
    if(x==y)
        return 0;
    int m=INT_MAX,pas;
    if(h[x]<h[y])
        swap(x,y);
    pas=lg[h[x]-h[y]];
    for(;pas>=0;--pas)
        if(h[str[pas][x]]>=h[y])
        {
            m=min(m,mini[pas][x]);
            x=str[pas][x];
        }
    if(x==y)
        return m;
    for(pas=lg[h[y]];pas>=0;--pas)
        if(str[pas][x]!=str[pas][y])
        {
            m=min(m,min(mini[pas][x],mini[pas][y]));
            x=str[pas][x];
            y=str[pas][y];
        }
    m=min(m,min(mini[0][x],mini[0][y]));
    return m;
}

int main()
{
    int i,x,y,X,Y,A,B,C,D,Z;
    in>>n>>m>>p;
    lg[2]=1;
    for(i=3;i<=n;++i)
        lg[i]=lg[i/2]+1;
    for(i=2;i<=n;++i)
    {
        in>>x>>y;
        str[0][i]=x;
        mini[0][i]=y;
    }
    in>>X>>Y>>A>>B>>C>>D;
    h[1]=1;
    for(i=2;i<=n;++i)
        h[i]=dfs(i);
    stramosi();
    for(i=1;i<=m;++i)
    {
        Z=query(X,Y);
        if(i>=m-p+1)
            out<<Z<<"\n";
        X=(X*A+Y*B)%n+1;
        Y=(Y*C+Z*D)%n+1;
    }
    return 0;
}