RE求助
查看原帖
RE求助
797187
Rorou楼主2024/8/19 11:26
#include<bits/stdc++.h>
using namespace std;
#define inf 10000000000000005
#define int  long long
int N,Q,R,V;
struct ft{
	int d,c;
}fun[100105];
int anc[64][100105],strm[64][101005];//j的第2^i级祖先为anc[i][j]
stack<int>s;
vector<int>v[101005];
int dep[110005];
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;  
	                                        //strm[i][x]从x到2^i级祖先的长度(容量)
	anc[0][x]=fa,strm[0][x]=fun[fa].c ;
	for(int i=1;(i<<1)<=dep[x];i++)anc[i][x]=anc[i-1][anc[i-1][x]],strm[i][x]=strm[i-1][anc[i-1][x]]+strm[i-1][x] ;
	for(int i=0;i<v[x].size();i++){
		dfs(v[x][i],x);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>N>>Q;
	for(int i=1;i<=N;i++){
		cin>>fun[i].d >>fun[i].c ;
	}
	fun[N+1].c =inf,fun[N+1].d =inf;//倒着来,根在最后
	for(int i=1;i<=N+1;i++){
		if(i==1){
			s.push(i);
			continue;
		}
		while(!s.empty()&&fun[i].d >fun[s.top()].d ){
			v[i].push_back(s.top());
			s.pop();
		}
		s.push(i);
	}
	dfs(N+1,0);
	while(Q--){
		cin>>R>>V;
		if(V<=fun[R].c ){
			cout<<R<<"\n";
			continue;
		}
		int total=V-fun[R].c; 
		int ans=0;
		for(int i=20;i>=0;i--){
			if(total-strm[i][R]>=0&&(1<<i)<=dep[R]){
				total-=strm[i][R];
				R=anc[i][R];
				
			}
		if(total==0)ans=R;
		}
		if(ans==0)ans=anc[0][R];
		if(ans==N+1)cout<<0<<"\n";
		else cout<<ans<<"\n";
	}
	return 0;
}
2024/8/19 11:26
加载中...