Cod sursa(job #2243360)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 20 septembrie 2018 12:49:25
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

struct Read {
    ifstream f;
    Read (const string &input) {
        f.open (input);
    }

    string s;
    int pos = (1 << 30), sz = 0, ret = 0;

    int getNextInt() {
        ret = 0;
        while (pos < sz && '0' <= s[pos] && s[pos] <= '9') {
            ret *= 10;
            ret += s[pos] - '0';
            ++pos;
        }
        ++pos;
        return ret;
    }

    int nextInt() {
        if (pos >= sz) {
            getline (f, s);
            pos = 0;
            sz = s.size();
        }

        return getNextInt();
    }
};

Read in ("stramosi.in");
ofstream g ("stramosi.out");

vector <int> v;
vector < vector <int> > dp;

int log2 (int n) {
    int ret = 0;
    while ((1 << ret) <= n) ++ret;
    return ret;
}

int main() {
    int n = in.nextInt();
    int m = in.nextInt();
    v.resize (n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        v[i] = in.nextInt();
    }
    int lg = log2 (n);
    dp.resize (lg + 1);

    for (int i = 0; i <= lg; ++i) {
        dp[i].resize (n + 1, 0);
        for (int j = 1; j <= n; ++j) {
            if (i == 0) {
                dp[i][j] = v[j];
            } else {
                dp[i][j] = dp[i - 1][dp[i - 1][j]];
            }
        }
    }

    while (m--) {
        int q = in.nextInt();
        int p = in.nextInt();
        int ans = 0;

        for (int bit = 0; bit < lg; ++bit) {
            if (!(p & (1 << bit))) continue;
            q = dp[bit][q];
        }

        g << q << '\n';
    }

    g.close();
    return 0;
}