Subtask #4没过
查看原帖
Subtask #4没过
637909
yuechongyan卷起来楼主2024/7/10 09:31
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 1e5 + 5;
const int M = 25;
const int INF = 0x3f3f3f3f;

int n, q;
int d[N], c[N];
int fa[N], depth[N]; 
int f[N][M], g[N][M];
int h[N], ne[N], e[N], idx;

void bfs() {
	queue<int> Q;
	Q.push(n + 1);
	memset(depth, 0x3f, sizeof depth);
	depth[n + 1] = 1; 
	
	while (Q.size()) {
		int t = Q.front(); Q.pop();
		for (int i = h[t]; ~i; i = ne[i]) {
			int j = e[i];
			if (depth[j] > depth[t] + 1) {
				depth[j] = depth[t] + 1;
				Q.push(j);
				f[j][0] = t; g[j][0] = c[t];
				for (int k = 1;(1 << k) <= depth[j]; k ++ ) f[j][k] = f[f[j][k - 1]][k - 1], g[j][k] = g[f[j][k - 1]][k - 1] + g[j][k - 1];
			}
		}
	}
}

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
} 

int query(int r, int v) {
	if (v <= c[r]) return r;
	v -= c[r];
	int now = r;
	for (int i = 20; i >= 0; i -- ) {
		if (v >= g[now][i] && (1 << i) <= depth[now]) {
			v -= g[now][i];
			now = f[now][i];
		}
	}
	if (v > 0) now = f[now][0];
	
	if (now == n + 1) return 0;
	else return now;
}

signed main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> q;
	for (int i = 1; i <= n; i ++ ) {
		cin >> d[i] >> c[i];
	}
	
	stack<int> stk;
	stk.push(1);
	d[n + 1] = INF; // 虚拟原点 
	for (int i = 2; i <= n + 1; i ++ ) {
		while (!stk.empty() && d[i] > d[stk.top()]) fa[stk.top()] = i, stk.pop();
		stk.push(i);
	}
	
	memset(h, -1, sizeof h);
	for (int i = 1; i <= n; i ++ ) add(fa[i], i);
	
	bfs();
	
	while (q -- ) {
		int r, v;
		cin >> r >> v;
		cout << query(r, v) << '\n'; 
	}
	
	return 0;
}
2024/7/10 09:31
加载中...