Cod sursa(job #1766663)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 28 septembrie 2016 12:32:10
Problema Atac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
ifstream f("atac.in");
ofstream g("atac.out");
int parcurgere[20][2*32005],lim,j,nr,n,m,poz[32005],nou[32005],vechi[32005],nivel[32005],d[16][32005],bombe[16][32005],cnt,u,p;
vector<int>vecini[200100];
void dfs(int tata,int k)
{
    int i,fiu;
    if(nou[tata]==0)
    {
        nou[tata]=++cnt;
        vechi[cnt]=tata;
        nivel[tata]=k;
    }
    parcurgere[1][++nr]=nou[tata];
    poz[nou[tata]]=nr;
    for(i=0; i<(int)vecini[tata].size(); i++)
    {
        fiu=vecini[tata][i];
        dfs(fiu,k+1);
        parcurgere[1][++nr]=nou[tata];
    }
}
int main()
{
    int x,i,k,y;
    f>>n>>m>>u;
    for(i=2;i<=n;i++)
    {
        f>>x>>y;
        d[0][i]=x;
        bombe[0][i]=y;
        vecini[x].push_back(i);
    }
    dfs(1,1);
    parcurgere[1][0]=nr;
    i=2;
    for(k=2;i<=nr;k++)
    {
        lim=parcurgere[k-1][0]-i/2;
        for(j=1;j<=lim;j++)
          parcurgere[k][j]=min(parcurgere[k-1][j],parcurgere[k-1][j+i/2]);
        parcurgere[k][0]=lim;
        i=1<<k;
    }
    for(i=1;i<=lim;i++)
      parcurgere[k][i]=1;
    lim=log2(n)+1;
    for(i=1;i<=lim;i++)
      for(j=1;j<=n;j++)
      {
          d[i][j]=d[i-1][d[i-1][j]];
          bombe[i][j]=min(bombe[i-1][j],bombe[i-1][d[i-1][j]]);
      }
    int a,b,rez,p1,p2,p3,p4,nx,ny,tx,xx,yy,rezf;
    f>>x>>y>>p1>>p2>>p3>>p4;
    for(i=1;i<=m;i++)
    {
        a=nou[x];
        b=nou[y];
        if(a!=b)
        {
            xx=min(poz[a],poz[b]);
            yy=max(poz[a],poz[b]);
            lim=yy-xx-1;
            lim=log2(lim);
            p=1<<lim;
            rez=min(parcurgere[lim+1][xx],parcurgere[lim+1][yy-p]);
            nx=nivel[x];
            ny=nivel[y];
            nr=nx-nivel[vechi[rez]];
            tx=x;
            rezf=2000000000;
            cnt=0;
            while(nr!=0)
            {
                if(nr%2!=0)
                {
                    rezf=min(bombe[cnt][tx],rezf);
                    tx=d[cnt][tx];
                }
                cnt++;
                nr/=2;
            }
            nr=ny-nivel[vechi[rez]];
            tx=y;
            cnt=0;
            while(nr!=0)
            {
                if(nr%2!=0)
                {
                    rezf=min(bombe[cnt][tx],rezf);
                    tx=d[cnt][tx];
                }
                cnt++;
                nr/=2;
            }
        }
        else
          rezf=0;
        x=(x*p1+y*p2)%n+1;
        y=(y*p3+rezf*p4)%n+1;
        if(i>m-u)
          g<<rezf<<"\n";
    }
    return 0;
}