제출 #1329476

#제출 시각아이디문제언어결과실행 시간메모리
1329476mfmme23Fountain (eJOI20_fountain)C++20
100 / 100
223 ms30860 KiB
#include <iostream>
#include <vector>
#include <stack>

using namespace std;

const int LOG = 18; 

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N, Q;
    if (!(cin >> N >> Q)) return 0;

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

    vector<vector<int>> up(N + 1, vector<int>(LOG, 0));

    vector<vector<long long>> cap(N + 1, vector<long long>(LOG, 0));


    stack<int> st;
    for (int i = N; i >= 1; i--) {
        while (!st.empty() && D[st.top()] <= D[i]) {
            st.pop();
        }
        if (!st.empty()) {
            up[i][0] = st.top();
        } else {
            up[i][0] = 0; 
        }
        cap[i][0] = C[i];
        st.push(i);
    }


    for (int j = 1; j < LOG; j++) {
        for (int i = 1; i <= N; i++) {
            int next_node = up[i][j - 1];
            up[i][j] = up[next_node][j - 1];
            cap[i][j] = cap[i][j - 1] + cap[next_node][j - 1];
        }
    }


    for (int q = 0; q < Q; q++) {
        int R;
        long long V;
        cin >> R >> V;

        int curr = R;
        

        for (int j = LOG - 1; j >= 0; j--) {
            if (up[curr][j] != 0 && V > cap[curr][j]) {
                V -= cap[curr][j];
                curr = up[curr][j];
            }
        }

       
        if (V > cap[curr][0]) {
            cout << 0 << "\n"; 
        } else {
            cout << curr << "\n"; 
        }
    }

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