Submission #1329470

#TimeUsernameProblemLanguageResultExecution timeMemory
1329470mfmme23Fountain (eJOI20_fountain)C++20
0 / 100
166 ms22432 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100005;
const int LOG = 17;

int N, Q;
long long D[MAXN], C[MAXN];
int nextGreater[MAXN];
int up[LOG][MAXN];
long long sumCap[LOG][MAXN];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> Q;

    for (int i = 1; i <= N; i++)
        cin >> D[i] >> C[i];

    // Next Greater
    stack<int> st;
    for (int i = N; i >= 1; i--) {
        while (!st.empty() && D[st.top()] <= D[i])
            st.pop();
        nextGreater[i] = st.empty() ? 0 : st.top();
        st.push(i);
    }

    // level 0
    for (int i = 1; i <= N; i++) {
        up[0][i] = nextGreater[i];
        sumCap[0][i] = C[i];
    }

    // binary lifting
    for (int k = 1; k < LOG; k++) {
        for (int i = 1; i <= N; i++) {
            int mid = up[k-1][i];
            if (mid == 0) {
                up[k][i] = 0;
                sumCap[k][i] = sumCap[k-1][i];
            } else {
                up[k][i] = up[k-1][mid];
                sumCap[k][i] = sumCap[k-1][i] + sumCap[k-1][mid];
            }
        }
    }

    while (Q--) {
        int R;
        long long V;
        cin >> R >> V;

        int cur = R;

        for (int k = LOG-1; k >= 0; k--) {
            if (cur != 0 && sumCap[k][cur] <= V) {
                V -= sumCap[k][cur];
                cur = up[k][cur];
            }
        }

        cout << cur << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...