Cod sursa(job #1151896)

Utilizator lianaliana tucar liana Data 24 martie 2014 13:45:42
Problema Atac Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <stdio.h>
#include<vector>
using namespace std;
#define nmax 32005
#define nemax 4*nmax
#define pmax 25
#define inf 10005
struct element{int n,c;};
int n, m, P, i, b, c, nivv, ne, log, aux, loga, minim, x, y, a, dif, pz, rez, d, z;
vector <element> ma[nmax];
element el;
int niv[nmax], p[nemax], poz[nmax], lg[nemax];
int rmq[nemax][pmax], t[nmax][pmax], cmin[nmax][pmax];

void citire()
{
    scanf("%ld %ld %ld",&n,&m,&P);
    for (i=2;i<=n;i++)
    {
        scanf("%ld %ld",&b,&c);
        el.n=b; el.c=c;
        ma[i].push_back(el);
        el.n=i;
        ma[b].push_back(el);
    }
}

void calculare(int x)
{
    for (log=1;(1<<log)<=niv[x];log++)
    {
        t[x][log]=t[t[x][log-1]][log-1];
        cmin[x][log]=cmin[x][log-1];
        if(cmin[x][log]>cmin[t[x][log-1]][log-1])
            cmin[x][log]=cmin[t[x][log-1]][log-1];
    }
}

void dfs(int x)
{
    vector<element>::iterator it;
    p[++ne]=x;
    if (poz[x]==0)
        poz[x]=ne;
    for (it=ma[x].begin();it!=ma[x].end();it++)
        if(poz[(*it).n]==0)
        {
            t[(*it).n][0]=x;
            cmin[(*it).n][0]=(*it).c;
            niv[(*it).n]=niv[x]+1;
            calculare((*it).n);
            dfs((*it).n);
            p[++ne]=x;
        }
}

void calc_rmq()
{
    for(i=1;i<=ne;i++)
    {
        rmq[i][0]=p[i];
        if (i>1)
            lg[i]=lg[i/2]+1;
    }
    for (log=1;(1<<log)<=ne;log++)
        for (i=1;i+(1<<log)-1<=ne;i++)
        {
            rmq[i][log]=rmq[i][log-1];
            if (niv[rmq[i+(1<<(log-1))][log-1]]<niv[rmq[i][log]])
                rmq[i][log]=rmq[i+(1<<(log-1))][log-1];
        }
}

int lca(int x, int y)
{
    x=poz[x];   y=poz[y];
    if(y<x)
    {   aux=x;  x=y;    y=aux;    }
    loga=lg[y-x+1];
    minim=rmq[x][loga];
    if (niv[rmq[y-(1<<loga)][loga]]<niv[minim])
        minim=rmq[y-(1<<loga)][loga];
    return minim;

}

void calc_min(int x)
{
    dif=niv[x]-niv[z];  pz=x;
    for (loga=0;(1<<loga)<=dif;loga++)
        if(((1<<loga)&dif)>0)
        {
            if (rez>cmin[pz][loga])
                rez=cmin[pz][loga];
            pz=t[pz][loga];
        }
}

void rezolvare()
{
    scanf("%ld %ld %ld %ld %ld %ld",&x,&y,&a,&b,&c,&d);
    for (i=1;i<=m;i++)
    {
        z=lca(x,y);
        //printf("%ld\n",z);
        rez=inf;
        calc_min(x);
        calc_min(y);
        if(i+P-1>=m)
            printf("%ld\n",rez);
        x=(x*a+y*b)%n+1;
        y=(y*c+rez*d)%n+1;
    }
}

int main()
{
    freopen("atac.in","r",stdin);
    freopen("atac.out","w",stdout);
    citire();
    niv[1]=1;
    dfs(1);
    calc_rmq();
    rezolvare();
    return 0;
}