可以预处理一个 n x t [ i ] nxt[i] nxt[i]表示 i i i可以一次到的最远距离
但还是太慢了
于是可以倍增
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int n,m,k,a[maxn];
ll f[maxn][22],pre[maxn];
int isok(int L)
{
int l = L,r = n,ans = -1;
while( r>=l )
{
int mid = l+r>>1;
if( pre[mid]-pre[L-1]<=k ) l = mid+1,ans = mid;
else r = mid-1;
}
if( ans==-1 ) return l-1;
return ans;
}
signed main()
{
cin >> n >> m >> k;
for(int i=1;i<=n;i++)
{
cin >> a[i];
pre[i] = pre[i-1]+a[i];
}
for(int i=1;i<=n;i++) f[i][0] = isok(i)+1;
for(int i=0;i<=21;i++) f[n+1][i] = n+1;
for(int j=1;j<=21;j++)
{
for(int i=1;i<=n;i++)
f[i][j] = f[f[i][j-1]][j-1];
}
for(int t=1;t<=m;t++)
{
int l,r; cin >> l >> r;
int now = l,ans = 0;
for(int i=21;i>=0;i--)
{
if( f[now][i]<=r ) now = f[now][i],ans+=(1<<i);
}
if( f[now][0]>r ) printf("%lld\n",ans+1);
else printf("Chtholly\n");
}
}