30 pts求条
查看原帖
30 pts求条
701478
_FastFT2013楼主2025/6/20 16:52
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
int n,q;
ll f[N][31],f1[N][31];
ll d[N],c[N];
stack<ll>stk;
int main(){
	memset(f1,0x3f,sizeof f1);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>d[i]>>c[i];
	}
	c[0]=2e9;
	for(int i=n;i>=1;i--){
		while(!stk.empty()&&d[stk.top()]<=d[i])stk.pop();
		if(!stk.empty()){
			f[i][0]=stk.top();
			f1[i][0]=c[i]+c[stk.top()];
		}
		stk.push(i);
	}
	for(int j=1;j<=30;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
            if(f[i][j]==0)break;
			f1[i][j]=f1[i][j-1]+f1[f[i][j-1]][j-1]-c[f[i][j-1]];
		}
	}
	for(int i=1;i<=q;i++){
		ll r,v;
		cin>>r>>v;
		if(v<=c[r]){
			cout<<r<<"\n";
			continue;
		}
        v-=c[r];
		for(int j=30;j>=0;j--){
			if(f1[r][j]-c[r]<v&&f[r][j]!=0){
				v-=f1[r][j]-c[r];
				r=f[r][j];
			}
		}
		cout<<f[r][0]<<"\n";
	}
	return 0;
}
2025/6/20 16:52
加载中...