Submission #1219673

#TimeUsernameProblemLanguageResultExecution timeMemory
1219673hiderrFountain (eJOI20_fountain)C++20
100 / 100
82 ms13140 KiB
#include <bits/stdc++.h>
using namespace std;

#define loop(i, a, b) for(int i = a; i <= b; i++)
#define loop_rev(i, a, b) for(int i = a; i >= b; i--)
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define pb push_back

using ll = long long;

struct StackEntry {
    int d;
    ll sum;
    int ind;
};

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, q; cin >> n >> q;

  vector<int> d(n + 1), c(n + 1);

  loop(i, 1, n) {
    cin >> d[i] >> c[i];
  }

  d[0] = 2e9;

  vector<vector<pair<int, ll>>> que(n + 1);

  loop(i, 0, q - 1) {
    int ind, v; cin >> ind >> v;
    que[ind].pb({ v, i });
  }

  vector<int> res(q);
  vector<StackEntry> st;
  st.pb({ d[0], c[0], 0 });

  loop_rev(i, n, 1) {
    while(st.back().d <= d[i]) {
        st.pop_back();
    }
    st.push_back({ d[i], c[i] + st.back().sum, i });
    for(auto [ val, q_ind ] : que[i]) {
        int l = -1, r = sz(st) - 2;
        while(l < r) {
            int mid = (l + r + 1) / 2;
            if(st.back().sum - st[mid].sum >= val) {
                l = mid;
            }
            else {
                r = mid - 1;
            }
        }
        res[q_ind] = st[l + 1].ind;
    }
  }

  loop(i, 0, q-1) {
    cout << res[i] << '\n';
  }

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