求助全WA,但是样例在电脑上过了,会关
查看原帖
求助全WA,但是样例在电脑上过了,会关
1333229
Oldtoswim楼主2025/7/20 10:11
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,q,d[100010],c[100010],r[100010][20],f[100010][20],g[100010][20],l[100010];
ll q_max(ll a,ll b){
	ll x=l[b-a+1];
	return max(r[a][x],r[b-(1<<x)+1][x]);
}
int main(){
	cin>>n>>q;
	for(ll i=1;i<=n;i++){
		cin>>d[i]>>c[i];
	}
	for(ll i=2;i<=n;i++){
		l[i]=l[i>>1]+1;
	}
	for(ll i=1;i<=n;i++){
		r[i][0]=d[i];
	}
	for(ll j=1;(1<<j)<=n;j++){
		for(ll i=1;i<=n-(1<<j);i++){
			r[i][j]=max(r[i][j-1],r[i+(1<<(j-1))][j-1]);
		}
		c[n+1]=100000000;
	}
	for(ll i=1;i<n;i++){
		ll l1=i+1,r1=n+1,mid;
		while(l1<r1){
			mid=(l1+r1)>>1;
			if(q_max(i+1,mid)<=d[i]){
				l1=mid+1;
			}else{
				r1=mid;
			}
		}
		f[i][0]=l1;
		g[i][0]=c[f[i][0]];
	}
	f[n][0]=n+1;
	g[n][0]=c[f[n][0]];
	for(ll i=1;i<=16;i++){
		for(ll j=1;j<=n;j++){
		   f[j][i]=f[f[j][i-1]][i-1];
		   g[j][i]=g[j][i-1]+g[f[i][i-1]][i-1];
		}
	}
	while(q--){
		ll r2,v;
		cin>>r2>>v;
		if(v>c[r2]){
			v-=c[r2];
		for(ll i=16;i>=0;i--){
			if(v>g[r2][i]){
				v-=g[r2][i];
				r2=f[r2][i];
			}
			r2=f[r2][0];
		}
		if(r2==n+1){
			r2=0;
		}
	}
		cout<<r2<<endl;
}
	return 0;
}
2025/7/20 10:11
加载中...