传送门

可以预处理一个 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");
    }
}