#include<bits/stdc++.h>
#define taskname "B"
using namespace std;
typedef long long ll;
const int lim = 4e5 + 5;
const int INF = 1e9 + 36;
int n, q, up[19][lim];
ll f[lim];
namespace sub1{
void solve(){
for(int _ = 0; _ < q; _++){
int l, r;
cin >> l >> r;
r++;
vector<ll>dp(n + 2, -INF);
dp[l] = 0;
for(int i = ++l; i <= r; i++){
dp[i] = max(dp[i - 1], dp[up[0][i]] + 1);
}
cout << dp[r] << "\n";
}
}
}
namespace sub23{
int st[lim << 2];
void build(int id, int l, int r){
if(l == r){
st[id] = up[0][l];
return;
}
int m = (l + r) >> 1;
build(id << 1, l, m);
build(id << 1 | 1, m + 1, r);
st[id] = max(st[id << 1], st[id << 1 | 1]);
}
int get(int id, int l, int r, int u, int v){
if(l > v || r < u){
return 0;
}
if(u <= l && v >= r){
return st[id];
}
int m = (l + r) >> 1;
return max(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v));
}
void solve(){
build(1, 0, n + 1);
for(int i = 2; i <= n; i++){
up[0][i] = get(1, 0, n + 1, up[0][i], i);
}
for(int i = 1; i < 19; i++){
for(int j = 0; j < n + 2; j++){
up[i][j] = up[i - 1][up[i - 1][j]];
}
}
for(int _ = 0; _ < q; _++){
int l, r, ans = 0;
cin >> l >> r;
for(int bit = 18, x = r + 1; bit > -1; bit--){
int nx = up[bit][x];
if(nx > l - 1){
x = nx;
ans |= 1 << bit;
}
}
cout << ans << "\n";
}
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
memset(up, 0, sizeof(up));
cin >> n;
map<ll, int>val;
val[f[0] = f[1] = 0] = 1;
for(int i = 2; i < n + 2; i++){
cin >> f[i];
auto it = val.find(f[i] += f[i - 1]);
if(it != val.end()){
up[0][i] = it->second;
}
val[f[i]] = i;
}
cin >> q;
if(max(n, q) <= 5000){
sub1::solve();
}
else{
sub23::solve();
}
}