#include #include using namespace std; int n; int q; int a[100111]; pair IT[500111]; int LEAFOFFSET; pair MAX(pair a,pair b) { if (a.first > b.first) return a; else return b; } pair getQuery(int L,int R) { if (R > n) R = n; pair ans = MAX(IT[L+LEAFOFFSET], IT[R+LEAFOFFSET]); L += LEAFOFFSET; R += LEAFOFFSET; while(R - L > 1) { if (L % 2 == 0) ans = MAX(ans, IT[L+1]); if (R % 2 == 1) ans = MAX(ans, IT[R-1]); L /= 2; R /= 2; } return ans; } int MIN(int a,int b) { if (a < b) return a; else return b; } pair jumps[100111][22]; int main() { freopen("jumps.in","r",stdin); freopen("jumps.out","w",stdout); int i,j; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d",&a[i]); } LEAFOFFSET = 1; while(LEAFOFFSET < n) LEAFOFFSET *= 2; LEAFOFFSET--; for (i=1;i<=n;i++) { IT[i+LEAFOFFSET] = make_pair(i + a[i], i); } for (i=LEAFOFFSET;i>=1;i--) { IT[i] = MAX(IT[2*i], IT[2*i+1]); } for (i=1;i<=n;i++) { jumps[i][0] = make_pair( getQuery(i, i + a[i]).second, i + a[i] ); //cout<<"One jump from "<=0;j--) { if (jumps[x][j].second >= y) { //cout<<"Can do right away "<<(1<