悬关,样例不过
查看原帖
悬关,样例不过
719619
drinktowind楼主2023/7/16 14:12
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,l,r,a[N],b[N],c[N][20],d[N][20];
stack <int> st;
int main() 
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&a[i],&b[i]);
	for(int i=1;i<=n;i++)
	{
		while(!st.empty()&&a[i]>a[st.top()])
		{
			c[st.top()][0]=i;
			d[st.top()][0]=b[i];
			st.pop();
		}
		st.push(i);
	}
	while(!st.empty())
	{
		c[st.top()][0]=0;
		st.pop();
	}
	for(int j=1;(1<<j)<=n;j++)
	{
		for(int i=1;i+(1<<j)<=n;i++)
		{
			c[i][j]=c[c[i][j-1]][j-1];
			d[i][j]=d[i][j-1]+d[d[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		if(b[l]>=r)
		{
			printf("%d\n",l);
			continue;
		}
		r-=b[l];
		for(int i=18;i>=0;i--)
		{
			if(c[l][i]&&r>d[l][i])
			{
				r-=d[l][i];
				l=c[l][i];
			}
		}
		printf("%d\n",c[l][0]);
	}
	return 0;
}
2023/7/16 14:12
加载中...