#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 1e9
#define f first
#define s second
#define pii pair<int, int>
#define vi vector<int>
const int MOD = 1'000'000'000 + 7;
void setIO(string name = "")
{
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
#ifdef LOCAL
    freopen("inp.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#else
    if (!name.empty())
    {
        freopen((name + ".INP").c_str(), "r", stdin);
        freopen((name + ".OUT").c_str(), "w", stdout);
    }
#endif
}
const int MAXN = 1e5;
int n; 
int d[MAXN + 5];
int c[MAXN + 5];
int under[MAXN + 5]; // under[i] = next reservoir
void init_under() {
    stack<int> st;
    for(int i = n; i >= 1; i--) {
        while(!st.empty() && d[st.top()] <= d[i]) st.pop();
        if(!st.empty()) under[i] = st.top();
        else under[i] = n + 1;
        st.push(i);
    }
}
vi g[MAXN + 5];
int h[MAXN + 5];
int dist[MAXN + 5];
int up[MAXN + 5][20];
void dfs(int u, int pre) { 
    up[u][0] = pre;
    for(int j = 1; j < 20; j++) {
        up[u][j] = up[up[u][j - 1]][j - 1];
    }
    for(int v : g[u]) {
        if(v == pre) continue;
        h[v] = h[u] + 1; 
        dist[v] = dist[u] + c[v];
        dfs(v, u);
    }
}
int kth_ancestor(int u, int k) {
    if(h[u] < k) return -1;
    for(int i = 0; (1 << i) <= k; i++) {
        if(k >> i & 1) u = up[u][i];
    }
    return u;
}
int get_dist(int u, int v) {
    // v is child of u
    if(u == n + 1) return dist[v];
    return dist[v] - dist[up[u][0]];
}
int bs(int source, int volume) {
    if(dist[source] <= volume) return 0;
    int l = 0, r = h[source];
    int res = h[source];
    while(l <= r) {
        int mid = (l + r) / 2;
        if(get_dist(kth_ancestor(source, mid), source) >= volume) res = mid, r = mid - 1;
        else l = mid + 1;
    }
    // cout << res << '\n';
    return kth_ancestor(source, res);
}
void solve()
{
    cin >> n;
    int q; cin >> q;
    for(int i = 1; i <= n; i++) cin >> d[i] >> c[i];
    init_under();
    for(int i = 1; i <= n; i++) {
        // cout << i << ' ' << under[i] << '\n';
        // cout << under[i] << '\n';
        g[i].push_back(under[i]);
        g[under[i]].push_back(i);
    }
    memset(up, 0, sizeof(up)); 
    dist[n + 1] = INF;
    h[n + 1] = 1;
    dfs(n + 1, 0);
    // cout << up[4][0] << '\n';
    // cout << get_dist(4, 3) << '\n';
    while(q--) {
        int r, v; cin >> r >> v; 
        cout << bs(r, v) << '\n'; 
    }
}
signed main()
{
    setIO();
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
}
컴파일 시 표준 에러 (stderr) 메시지
fountain.cpp: In function 'void setIO(std::string)':
fountain.cpp:23:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         freopen((name + ".INP").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fountain.cpp:24:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         freopen((name + ".OUT").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |