Cod sursa(job #1205694)

Utilizator pentrusandaPentru Sanda pentrusanda Data 7 iulie 2014 18:24:33
Problema Atac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.28 kb
#include <fstream>

using namespace std;

struct nod
{
    int urm,cost;
    nod *adr;
};

typedef nod *lda1;

lda1 lda[32005];

int n,m,p,x,y,z,a,b,c,d;

int peuler[130005],inl[130005],pra[32005],trecut[32005],nr;

int rmq[130005][20],put[20],pa[130005];

int rmq2[32005][20][2],hnod[32005],lista[32005],nr2;

int v1,v2,cmasc,dif;

void parc(int nod,int h)
{
    trecut[nod]=1; hnod[nod]=h;
    ++nr; peuler[nr]=nod; inl[nr]=h; if (pra[nod]==0) pra[nod]=nr;
    for (lda1 p=lda[nod];p!=0;p=p->adr)
    {
        if (trecut[p->urm]==0)
        {
            parc(p->urm,h+1);
            ++nr; peuler[nr]=nod; inl[nr]=h;
        }
    }
}

void parc2 (int nod,int h,int cost)
{
    trecut[nod]=1;
    lista[h]=nod;
    rmq2[nod][0][0]=cost; rmq2[nod][0][1]=lista[h-1];
    for (int i=1;i<20;++i)
    {
        if (put[i]<h)
        {
            rmq2[nod][i][0]=rmq2[nod][i-1][0];
            if (rmq2[lista[h-put[i-1]]][i-1][0]<rmq2[nod][i][0]) rmq2[nod][i][0]=rmq2[lista[h-put[i-1]]][i-1][0];
            rmq2[nod][i][1]=lista[h-put[i]];
        }
    }
    for (lda1 p=lda[nod];p!=0;p=p->adr)
    {
        if (trecut[p->urm]==0)
        {
            parc2(p->urm,h+1,p->cost);
        }
    }
}

int main()
{
    ifstream in ("atac.in");
    ofstream out ("atac.out");

    in>>n>>m>>p;

    for (int i=2;i<=n;++i)
    {
        in>>x>>y;
        lda1 p=new nod;
        p->urm=x;
        p->cost=y;
        p->adr=lda[i];
        lda[i]=p;
        p=new nod;
        p->urm=i;
        p->cost=y;
        p->adr=lda[x];
        lda[x]=p;
    }

    in>>x>>y>>a>>b>>c>>d;


    parc(1,1);


    put[0]=1; for (int i=1;i<20;++i) put[i]=put[i-1]*2;
    pa[0]=0; for (int i=1;i<130005;++i) { pa[i]=pa[i-1]; if (put[pa[i]+1]==i) pa[i]++; }

    for (int i=nr;i>0;--i)
    {
        rmq[i][0]=i;
        for (int j=1;j<20;++j)
        {
            if(i+put[j]-1<=nr)
            {
                rmq[i][j]=rmq[i][j-1];
                if (inl[rmq[i+put[j-1]][j-1]]<inl[rmq[i][j]]) rmq[i][j]=rmq[i+put[j-1]][j-1];
            }
        }
    }

    for (int i=1;i<=n;++i) trecut[i]=0;
    parc2(1,1,0);

    for (int i=1;i<=m;++i)
    {
        if (x!=y)
        {
            v1=pra[x],v2=pra[y],cmasc,dif;
            if (v1>v2) { int t=v1; v1=v2; v2=t; }
            dif=v2-v1+1;
            cmasc=rmq[v1][pa[dif]];
            if (inl[rmq[v2-put[pa[dif]]+1][pa[dif]]]<inl[cmasc])  cmasc=rmq[v2-put[pa[dif]]+1][pa[dif]];
            cmasc=peuler[cmasc];

            z=0;

            dif=hnod[x]-hnod[cmasc];
            int v=x;
            while (dif>0)
            {
                if (z==0 || rmq2[v][pa[dif]][0]<z) z=rmq2[v][pa[dif]][0];
                v=rmq2[v][pa[dif]][1];
                dif=dif-put[pa[dif]];
            }

            dif=hnod[y]-hnod[cmasc];
            v=y;
            while (dif>0)
            {
                if (z==0 || rmq2[v][pa[dif]][0]<z) z=rmq2[v][pa[dif]][0];
                v=rmq2[v][pa[dif]][1];
                dif=dif-put[pa[dif]];
            }

        }else
        {
            z=0;
        }

            if (i>m-p) out<<z<<"\n";

            x=(x*a+y*b)%n+1;
            y=(y*c+z*d)%n+1;

    }

    in.close();
    out.close();
    return 0;
}