思路:结构体中v是值,d是下标 从后往前维护以当前值结尾的单调递减序列,当前位置的水会直接流入此序列倒数第二个水池中。 后边四组数据TLE
#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;
}