样例美国。。。求调
查看原帖
样例美国。。。求调
809371
Love_Natsu楼主2024/3/27 09:43
#include <iostream>
#define N 100005
using namespace std;
int n,Q,c[N],d[N],s[N][20],log_2[N],r,v,to[N][20],io[N][20],ex;
void init(){//st表
	for(int i=2;i<=n;i++)log_2[i]=log_2[i/2]+1;
	for(int i=1;i<=n+1;i++)s[i][0]=d[i];
	for(int t=1;(1<<t)<=n;t++)
	    for(int i=1;i<=n-(1<<t)+1;i++)
	    	s[i][t]=max(s[i][t-1],s[i+(1<<t-1)][t-1]);
}
int RMQ(int l,int r){
	int p=log_2[r-l+1];
	return max(s[l][p],s[1+r-(1<<p)][p]);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	std::cin>>n>>Q;
	for(int i=1;i<=n;i++)cin>>d[i]>>c[i];
	io[n][0]=d[n+1]=c[n+1]=0x3f3f3f3f;
	init();
	for(int i=1;i<=n;i++){
    	int l=i+1,r=n+1,mid;
    	while (l<r){
    		//cout<<l<<" "<<r<<" ";
    		mid=(l+r)/2;
    		if(RMQ(i+1,mid)>d[i])r=mid;
    		else l=mid+1;
    		//cout<<d[i]<<" "<<RMQ(i+1,mid)<<"\n";
		}
		//cout<<"\n";
		to[i][0]=l;
		io[i][0]=c[to[i][0]];
	}
	to[n][0]=n+1;
	for(int t=1;t<=16;t++)
		for(int i=1;i<=n;i++){
			to[i][t]=to[to[i][t-1]][t-1];
			io[i][t]=io[i][t-1]+io[to[i][t-1]][t-1];
		}
	while (Q--){
		cin>>r>>v;
		v-=c[r];
		if(v>c[r]){
			v-=c[r];
			for(int t=16;t>=0;t--)
				if(v>io[r][t]){v-=io[r][t];r=to[r][t];}
			r=to[r][0];
		}
		cout<<r%(n+1)<<"\n";
	}
	return 0;
}
2024/3/27 09:43
加载中...