Cod sursa(job #2286641)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 20 noiembrie 2018 16:43:58
Problema Atac Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin ("atac.in");
ofstream cout ("atac.out");
vector <int> v[32013];
int cst[32013],t[32013],e[64020],r1[32013][20],r2[32013][20],ct[32013][20],niv[32013],pz[32013],log[64023],n,m,p,k;
void citire ()
{
    int i;
    cin>>n>>m>>p;
    for(i=2;i<=n;++i)
    {
        int a,b;
        cin>>a>>b;
        t[i]=a;
        cst[i]=b;
        v[a].push_back(i);
    }
}
void euler (int nc)
{
    e[++k]=nc;
    pz[nc]=k;
    for(int i=0;i<v[nc].size();++i)
    {
        int nn=v[nc][i];
        niv[nn]=niv[nc]+1;
        euler(nn);
        e[++k]=nc;
    }
}
void mklg ()
{
    for(int i=2;i<=2*n;++i)
        log[i]=1+log[i/2];
}
void mkr1 ()
{
    int i,j;
    for(i=1;i<=k;++i)
    {
        for(j=0;j<=log[i];++j)
        {
            if(j==0)
                r1[i][j]=e[i];
            else
            {
                r1[i][j]=r1[i][j-1];
                if(niv[r1[i-(1<<(j-1))][j-1]]<niv[r1[i][j]])
                    r1[i][j]=r1[i-(1<<(j-1))][j-1];
            }
        }
    }
}
void mkr2 ()
{
    int i,j;
    for(i=1;i<=n;++i)
    {
        for(j=0;j<=log[niv[i]];++j)
        {
            if(j==0)
                ct[i][j]=t[i];
            else
                ct[i][j]=ct[ct[i][j-1]][j-1];
            if(j==0)
                r2[i][j]=cst[i];
            else
                r2[i][j]=max(r2[i][j-1],r2[i-(1<<(j-1))][j-1]);
        }
    }
}
int slv (int a, int b)
{
    int ca,cb,val,vla,vlb,mi,poza,pozb,ctsc,pas=1<<15;
    if(a==b)
        return 0;
    if(a>b)
        swap(a,b);
    ca=pz[a];
    cb=pz[b];
    val=r1[ca+(1<<(log[cb-ca+1]))-1][log[cb-ca+1]];
    if(niv[val]>niv[r1[cb][log[cb-ca+1]]])
        val=r1[cb][log[b-a+1]];
    vla=niv[a]-niv[val]-1;
    vlb=niv[b]-niv[val]-1;
    ctsc=niv[a]-(1<<(log[vla]));
    if(vla==0)
        ctsc=0;
    poza=a;
    while(ctsc>0)
    {
        if(ctsc>=pas)
            poza=ct[poza][log[pas]],ctsc-=pas;
        pas>>=1;
    }
    pas=1<<15;
    ctsc=niv[b]-(1<<(log[vlb]));
    if(vlb==0)
        ctsc=0;
    pozb=b;
    while(ctsc>0)
    {
        if(ctsc>=pas)
            pozb=ct[pozb][log[pas]],ctsc-=pas;
        pas>>=1;
    }
    mi=r2[poza][log[vla]];
    mi=min(mi,r2[a][log[vla]]);
    mi=min(mi,r2[pozb][log[vlb]]);
    mi=min(mi,r2[a][log[vla]]);
    return mi;
}
void rez ()
{
    int x,y,a,b,c,d,z,i;
    cin>>x>>y>>a>>b>>c>>d;
    for(i=1;i<=m;++i)
    {
        z=slv(x,y);
        if(i>=m-p+1)
            cout<<z<<'\n';
        x=(x*a + y*b) % n + 1;
        y=(y*c + z*d) % n + 1;
    }
}
int main()
{
    citire();
 //   niv[1]=1;
    euler(1);
    mklg();
    mkr1();
    mkr2();
    rez();
    return 0;
}