Cod sursa(job #1418960)

Utilizator figure0907Andrei Gonczi figure0907 Data 14 aprilie 2015 14:46:33
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
# include <bits/stdc++.h>
using namespace std;
class Reader {
  public:
    Reader(const string& filename):
            m_stream(filename),
            m_pos(kBufferSize - 1),
            m_buffer(new char[kBufferSize]) {
        next();
    }

    Reader& operator>>(int& value) {
        value = 0;
        while (current() < '0' || current() > '9')
            next();
        while (current() >= '0' && current() <= '9') {
            value = value * 10 + current() - '0';
            next();
        }
        return *this;
    }

  private:
    const int kBufferSize = 32768;

    char current() {
        return m_buffer[m_pos];
    }

    void next() {
        if (!(++m_pos != kBufferSize)) {
            m_stream.read(m_buffer.get(), kBufferSize);
            m_pos = 0;
        }
    }

    ifstream m_stream;
    int m_pos;
    unique_ptr<char[]> m_buffer;
};
Reader fi("stramosi.in");
int dp[300005][25];
int lg[300005];
int main(void)
{
    int n,m;
    fi>>n>>m;
    freopen("stramosi.out","w",stdout);
    for (int i=1;i<=n;++i) fi>>dp[i][0];
    for (int i=1;i<=n;++i)
    {
        int a = dp[i][0],b = 0;
        while (a) dp[i][++b] = dp[a][b-1],a = dp[a][b-1];
    }
    for (int i=2;i<=n;++i) lg[i] = lg[i>>1] + 1;
    int x,y;
    while (m --)
    {
        fi>>x>>y;
        while (x && y)
        {
            x = dp[x][lg[y&-y]];
            y-=y&-y;
        }
        printf("%d\n",x);
    }
    return 0;
}