题目:
思路:做一个下一个流到哪的表和总容量表
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define int long long
const int N=1e5+10;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
const double eps=1e-10;
//ne[i][j]:第j个盘溢出i+1次流到的位置
//sum[i][j]:第j个盘溢出i+1次时盘内可容纳的水量
int d[N],ne[N][50],sum[N][50],sta[N];
int n,l;
void init(){
for(int i=1;i<=l;i++){//完成ne的表和sum的表
for(int j=1;j<=n;j++){
ne[j][i]=ne[ne[j][i-1]][i-1];
sum[j][i]=sum[j][i-1]+sum[ne[j][i-1]][i-1];
}
}
}
signed main(){
// ios::sync_with_stdio(false);
int q,t=0;cin>>n>>q; l=log2(n)+1;
for(int i=1;i<=n;i++)cin>>d[i]>>sum[i][0];
for(int i=n;i>0;i--){
while(t&&d[i]>=d[sta[t]])t--;//栈
ne[i][0]=sta[t];//i盘溢出后到达的下一个位置
// cout<<sta[t]<<endl;
sta[++t]=i;
// cout<<t<<endl;
}
init();
// for(int i=0;i<=l;i++){
// for(int j=1;j<=n;j++)
// cout<<ne[j][i]<<' ';
// cout<<endl;}
while(q--){
int r,v;cin>>r>>v;
for(int i=l;i>=0;i--){
if(sum[r][i]<v)v-=sum[r][i],r=ne[r][i];//第一次小于v的位置
}cout<<r<<endl;
}
return 0;
}