#include void input(std::string f) { std::string one = f + ".in"; std::string two = f + ".out"; freopen(one.c_str(), "r", stdin); freopen(two.c_str(), "w", stdout); } const int N = 1e5 + 7; const int LOG = 20; int n; int a[N]; int parent[N], d[N]; int for_up[N][LOG]; int st[4*N]; void init_st(int ind, int l, int r) { if(l == r) { st[ind] = l; return ; } int mid = (l+r) >> 1; init_st(2*ind, l, mid); init_st(2*ind + 1, mid+1, r); if(a[ st[2*ind] ] > a[ st[2*ind + 1] ]) st[ind] = st[2*ind]; else st[ind] = st[2*ind + 1]; return ; } int find_max(int ind, int l, int r, int sl, int sr) { if(sl > r || sr < l) return 0; if(sl <= l && r <= sr) return st[ind]; int mid = (l+r) >> 1; int first = find_max(2*ind, l, mid, sl, sr); int second = find_max(2*ind + 1, mid+1, r, sl, sr); if(a[first] > a[second]) return first; return second; } void preprocess() { for(int i = 1; i <= n; i++) for_up[i][0] = parent[i]; for(int j = 1; j < LOG; j++) { for(int i = 1; i <= n; i++) { for_up[i][j] = for_up[for_up[i][j-1]][j-1]; } } } int go_up(int v, int t) { if(t == 0) return v; for(int i = LOG - 1; i >= 0; i--) if(t & (1<> n; for(int i = 1; i <= n; i++) { std::cin >> a[i]; a[i] += i; a[i] = std::min(n, a[i]); } init_st(1, 1, n); for(int i = 1; i <= n; i++) parent[i] = find_max(1, 1, n, i, a[i]); //for(int i = 1; i <= n; i++) // std::cout << parent[i] << "\n"; preprocess(); d[n] = 0; for(int i = n-1; i >= 1; i--) d[i] = d[parent[i]] + 1; int q; std::cin >> q; for(int i = 0; i < q; i++) { int x, y; std::cin >> x >> y; int l = 0, r = n-1, mid; //std::cout << go_up(x, 1) << " " << 1 << "\n"; while(l != r) { mid = (l+r) >> 1; //std::cout << go_up(x, mid) << " " << mid << "\n"; if(a[go_up(x, mid)] >= y) r = mid; else l = mid+1; } std::cout << l+1 << "\n"; //std::cout << "\n"; } return 0; }