30分TLE求调
查看原帖
30分TLE求调
1095195
aliah楼主2024/4/18 15:50
#include<bits/stdc++.h>
using namespace std;
struct st
{
	long long v,d;
}x[100002];
long long a[100002],k=0,e[100002],f[100002];
int main() 
{
	long long n,q,i,b,c,d=0;
	scanf("%lld%lld",&n,&q);
	for(i=0;i<n;i++)
		scanf("%lld%lld",a+i,f+i);
	a[n]=0x7fffffff;
	f[n]=0x7fffffff;
	x[0].d=n-1;
	x[0].v=a[n-1];
	e[n-1]=-1;
	if(n>1)
	for(i=n-2;i>=0;i--)
	{
		if(x[k].v>a[i])
		{
			k++;
			x[k].d=i;
			x[k].v=a[i];
		}
		else
		{
			b=0;
			c=k;
			while(c-b>1)
			{
				d=(b+c)/2;
				if(x[d].v<=a[i])
					c=d;
				else
					b=d;
			}
			while(b>0 && x[b].v<a[i])
				b--;
			while(b<k && x[b].v>a[i])
				b++;
			x[b].d=i;
			x[b].v=a[i];
			k=b;
		}
		if(k>0)
			e[i]=x[k-1].d;
		else
			e[i]=-1;
	}
	for(i=0;i<q;i++)
	{
		scanf("%lld%lld",&b,&c);
		k=b-1;
		while(c>0)
		{
			c-=f[k];
			if(c>0)
				k=e[k];
		}
		printf("%lld\n",(k+1)%(n+1));
	}
	return 0;
}
2024/4/18 15:50
加载中...