萌新妹子求助QwQ
查看原帖
萌新妹子求助QwQ
718017
Dream__maker楼主2024/2/29 22:36
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5 , inf = 1e9 + 5 ; 
int n , qus ; 
int head[N] , lg[N] , f[N][25] , g[N][25] , dep[N] ; 
struct node{int d , c ; }plt[N];
struct node2 {int to , nxt ; }e[N];
int cnt = 0 ; 
void add(int x , int y)
{
	cnt ++ ; 
	e[cnt].to = y ; 
	e[cnt].nxt = head[x] ; 
	head[x] = cnt ; 
}
void dfs(int now , int fa)
{
	f[now][0] = fa , g[now][0] = plt[fa].c , dep[now] = dep[fa] + 1 ;
	for(int i = 1 ; i <= lg[dep[now]] ; i ++) 
	{
		f[now][i] = f[f[now][i - 1]][i - 1] ; 
		g[now][i] = g[now][i - 1] + g[f[now][i - 1]][i - 1] ; 
	}
	for(int i = head[now] ; i ; i = e[i].nxt) 
	{
		dfs(e[i].to , now) ; 
	}
}
int main()
{
	cin >> n >> qus ; 
	for(int i = 1 ; i <= n ; i ++)
		scanf("%d %d" , &plt[i].d , &plt[i].c) ; 	
	plt[n + 1].d = inf , plt[n + 1].c = inf ; 
	stack <int> q ; 
	for(int i = 1 ; i <= n + 1 ; i ++)
	{
		while(! q.empty() && plt[i].d > plt[q.top()].d) {add(i , q.top()) , q.pop() ; }
		q.push(i) ; 
	}
	for(int i = 1 ; i <= n ; i ++) lg[i] = log2(i) ; 
	dfs(n + 1 , 0) ; 
	for(int ii = 1 , r , v ; ii <= qus ; ii ++)
	{
		scanf("%d %d" , &r , &v) ; 
		if(v <= plt[r].c)
		{
			printf("%d\n" , r) ; 
			continue ; 
		}
		v -= plt[r].c ; 
		for(int i = 20 ; i >= 0 ; i --)
		{
			if((1 << i) > dep[r] || g[r][i] > v) continue ; 
			v -= g[r][i] , r = f[r][i] ; 
		}
		int ans ; 
		if(v == 0) ans = r ; 
		else ans = f[r][0] ; 
		if(ans == n + 1) ans = 0 ; 
		printf("%d\n" , ans) ;  
	}
	return 0;
}
2024/2/29 22:36
加载中...