0pts求调
查看原帖
0pts求调
535407
Retr0_Gu楼主2024/10/14 19:26
#include <bits/stdc++.h>
#define to(i) edge[i].to
#define next(i) edge[i].next
using namespace std;

const int N = 1e5 + 2;

struct Edge{
    int to;
    int next;
}edge[N];

int n, cnt, d[N], c[N], head[N], dep[N], lg[N], p[N][17], dist[N][17];

void add_edge(int u, int v){
    to(++cnt) = v;
    next(cnt) = head[u];
    head[u] = cnt;
}

void init(){
    queue<int> q;
    for (int i = 2; i <= n; i++)
        lg[i] = lg[i >> 1] + 1;
    q.push(n + 1);
    while (!q.empty()){
        int u = q.front();
        q.pop();
        for (int i = head[u]; i; i = next(i)){
            int v = to(i);
            dep[v] = dep[u] + 1;
            p[v][0] = u, dist[v][0] = c[v];
            for (int k = 1; k <= lg[dep[v]]; k++){
                p[v][k] = p[p[v][k - 1]][k - 1];
                dist[v][k] = dist[v][k - 1] + dist[p[v][k - 1]][k - 1];
            }
            q.push(v);
        }
    }
}

int query(int r, int v){
    for (int i = lg[dep[r]]; i >= 0; i--)
        if (v > dist[r][i]) v -= dist[r][i], r = p[r][i];
    return r <= n ? r : 0;
}

int main(){
    int q;
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &d[i], &c[i]);
    d[n + 1] = c[n + 1] = 0x7F7F7F7F;
    stack<int> st;
    for (int i = 1; i <= n + 1; i++){
        while (!st.empty() && d[i] > d[st.top()])
            add_edge(i, st.top()), st.pop();
        st.push(i);
    }
    init();
    while (q--){
        int r, v;
        scanf("%d%d", &r, &v);
        printf("%d\n", query(r, v));
    }
    return 0;
}
2024/10/14 19:26
加载中...