#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
using namespace std;
const int sz = 1e5 + 5, inf = 1e9 + 7;
int n, q, dp[20][sz], sg[sz << 2], cost[sz], dist[sz];
array<int, 2> a[sz];
vector<int> v, g[sz];
int get(int ind, int l, int r, int lx, int rx)
{
    if(l > rx || r < lx) return n + 1;
    if(lx <= l && r <= rx) return sg[ind];
    int mid = (l + r) >> 1;
    return min(get(ind << 1, l, mid, lx, rx), get(ind << 1 | 1, mid + 1, r, lx, rx));
}
void upd(int ind, int l, int r, int x, int val)
{
    if(l == r)
    {
        sg[ind] = val;
        return;
    }
    int mid = (l + r) >> 1;
    if(x <= mid) upd(ind << 1, l, mid, x, val);
    else upd(ind << 1 | 1, mid + 1, r, x, val);
    sg[ind] = min(sg[ind << 1], sg[ind << 1 | 1]);
}
int id(int i)
{
    return upper_bound(all(v), i) - v.begin();
}
void dfs(int v)
{
    for(int i : g[v])
    {
        dist[i] = dist[v] + 1;
        cost[i] = cost[v] + a[i][1];
        dfs(i);
    }
}
void solve()
{
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
    {
        upd(1, 1, n, i, n + 1);
        cin >> a[i][0] >> a[i][1];
        v.push_back(a[i][0]);
    }
    v.push_back(inf);
    sort(all(v));
    v.erase(unique(all(v)), v.end());
    
    upd(1, 1, n, v.size(), n + 1);
    for(int i = n; i >= 1; i--)
    {
        int ix = id(a[i][0]);
        dp[0][i] = get(1, 1, n, ix + 1, v.size());
        g[dp[0][i]].push_back(i);
        upd(1, 1, n, ix, i);
    }
    dp[0][n + 1] = n + 1;
    for(int i = 1; i < 20; i++)
    {
        for(int j = 1; j <= n + 1; j++)
        {
            dp[i][j] = dp[i - 1][dp[i - 1][j]];
        }
    }
    dfs(n + 1);
    while(q--)
    {
        int R, V;
        cin >> R >> V;
        if(cost[R] < V)
        {
            cout << 0 << '\n';
            continue;
        } 
        int l = 1, r = dist[R];
        while(l <= r)
        {
            int mid = (l + r) >> 1, u = R;
            for(int i = 0; i < 20; i++)
            {
                if((1 << i) & mid) u = dp[i][u];
            }
            if(V > cost[R] - cost[u]) l = mid + 1;
            else r = mid - 1;
        }
        int u = R;
        --l;
        for(int i = 0; i < 20; i++)
        {
            if((1 << i) & l) u = dp[i][u];
        }
        cout << u << '\n';
    }
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int t = 1;
    // cin >> t;
    while(t--) solve();
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |