Mai intai trebuie sa te autentifici.

Cod sursa(job #1673106)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 3 aprilie 2016 14:26:35
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <bitset>
#include <vector>

using namespace std;

ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int NMAX = 250001;
int H[NMAX];
stack<int> st;
bitset<NMAX>mark;
int sp[NMAX][20];
vector<int> muchii[NMAX];
int n,m;
int height;
int lg[NMAX];

void citire()
{
    in>>n>>m;
    int x;
    for(int i=1;i<=n;i++)
    {
        in>>x;
        if(x)
        {
            sp[i][0] = x;
            muchii[x].push_back(i);
        }
    }
}

void dfs(int x)
{
    mark.set(x);
    st.push(x);
    int y,ok,target;
    while(!st.empty())
    {
        y = st.top();
        ok = 0;
        for(unsigned int i=0;i<muchii[y].size();i++)
            if(!mark.test(muchii[y][i]))
        {
            ok = 1;
            target = muchii[y][i];
            break;
        }
        if(ok)
        {
            H[target] = H[y] + 1;
            if(height < H[target])
                height = H[target];
            st.push(target);
            mark.set(target);
        }
        else
            st.pop();
    }
}

void sparse_table()
{
    for(int i=2;i<=height;i++)
        lg[i] = lg[i/2] + 1;
    for(int j=1;(1<<j)<=height;j++)
        for(int i=1;i<=n;i++)
            if((1<<j)<=H[i])
            sp[i][j] = sp[sp[i][j-1]][j-1];
}

int main()
{
    citire();
    for(int i=1;i<=n;i++)
        if(!sp[i][0])
        dfs(i);
    sparse_table();
    int x,y,k;
    for(int i=1;i<=m;i++)
    {
        in>>x>>y;
        if(y > H[x])
            out<<0<<"\n";
        else
        {
            while(y)
            {
                k = lg[y];
                x = sp[x][k];
                y-=(1<<k);
            }
            out<<x<<"\n";
        }
    }
    in.close();
    out.close();
    return 0;
}