Submission #1245282

#TimeUsernameProblemLanguageResultExecution timeMemory
1245282kchu_zFountain (eJOI20_fountain)C++20
100 / 100
606 ms39892 KiB
#include <bits/stdc++.h>
using namespace std;

long long n, q, diameter[100001], capacity[100001], parent[100001], dp[100001][20];
long long dp_sum[100001][20];

bool visited[100001][20], visited_sum[100001][20];

long long lift(long long vertice, long long lg) {
    if (lg == 0) return parent[vertice];

    if (visited[vertice][lg]) return dp[vertice][lg];
    visited[vertice][lg] = 1;

    return dp[vertice][lg] = lift(lift(vertice, lg - 1), lg - 1);
}

long long sum(long long vertice, long long lg) {
    if (lg == 0) return capacity[vertice];

    if (visited_sum[vertice][lg]) return dp_sum[vertice][lg];
    visited_sum[vertice][lg] = 1;

    return dp_sum[vertice][lg] = sum(vertice, lg - 1) + sum(lift(vertice, lg - 1), lg - 1);
}

int main() {

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> q;

    stack <long long> st;

    for (long long i = 0; i < n; i++) {
        cin >> diameter[i] >> capacity[i];
    }

    diameter[n] = 1e9 + 1;
    capacity[n] = 1e9;

    for (long long i = 0; i <= n; i++) {
        while (st.size() && diameter[st.top()] < diameter[i]) {
            parent[st.top()] = i;
            st.pop();
        }

        st.push(i);
    }

    parent[n] = n;

    while (q--) {
        long long vertice, volume;
        cin >> vertice >> volume;
        vertice--;

        for (long long mask = 20; mask >= 0; mask--) {
            if (sum(vertice, mask) >= volume) continue;

            volume -= sum(vertice, mask);
            vertice = lift(vertice, mask);
        }

        cout << (vertice + 1) % (n + 1) << endl;
    }

    return 0;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...