Cod sursa(job #1853968)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 22 ianuarie 2017 11:38:09
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
char lider[250001];
vector <int>fii[250001];
int a[20][250001];
FILE *fin = fopen("stramosi.in", "r");
FILE *fout = fopen("stramosi.out", "w");
int main()
{
    int n,m;
    fscanf(fin,"%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        int x;
        fscanf(fin,"%d",&x);
        if(x==0) lider[i]=1;
        fii[x].push_back(i);
    }
    for(int i=1;i<=n;i++)
    {
        if(lider[i]==1)
        {
            for(auto nod:fii[i])
            {
                a[0][nod]=i;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(lider[i]==1)
        {
            queue <int> frontiera;
            frontiera.push(i);
            while(!frontiera.empty())
            {
                int nod = frontiera.front();
                frontiera.pop();
                for(auto node:fii[nod])
                {
                    frontiera.push(node);
                    a[0][node]=nod;
                    for(int j=1;1<<j<=n;j++)
                    {
                        a[j][node]=a[j-1][a[j-1][node]];
                    }
                }
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fscanf(fin,"%d%d",&y,&x);
        int pivot=1;
        int putere=0;
        while(pivot*2<=x)
        {
            pivot*=2;
            putere++;
        }
        int actual=a[putere][y];
        x-=pivot;
        int incerc=1<<20;
        putere=20;
        while(x>0)
        {
            if(incerc>x)
            {
                incerc/=2;
                putere--;
            }
            else
            {
                actual=a[putere][actual];
                x-=incerc;
            }
        }
        fprintf(fout,"%d\n",actual);
    }
    return 0;
}