// GPT'S code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 400000 + 5;
const int LOG = 20;
int n, q;
ll c[MAXN];
ll p[MAXN]; // prefix sums
int pre[MAXN]; // previous occurrence
int nxt[MAXN]; // next jump
int up[LOG][MAXN]; // binary lifting
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> c[i];
// prefix sums
p[0] = 0;
for (int i = 1; i <= n; i++) p[i] = p[i-1] + c[i];
// compute pre[i]
unordered_map<ll, int> last;
last.reserve(n * 2);
last.max_load_factor(0.7);
for (int i = 0; i <= n; i++) {
if (last.count(p[i])) pre[i] = last[p[i]];
else pre[i] = -1;
last[p[i]] = i;
}
// bucket by pre[i]
vector<vector<int>> bucket(n + 1);
for (int i = 0; i <= n; i++) {
if (pre[i] >= 0)
bucket[pre[i]].push_back(i);
}
// build nxt using min-heap
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = n; i >= 0; i--) {
for (int y : bucket[i]) {
pq.push(y);
}
if (!pq.empty()) nxt[i] = pq.top();
else nxt[i] = n + 1; // invalid
}
// binary lifting
for (int i = 0; i <= n; i++) up[0][i] = nxt[i];
for (int k = 1; k < LOG; k++) {
for (int i = 0; i <= n; i++) {
if (up[k-1][i] <= n)
up[k][i] = up[k-1][ up[k-1][i] ];
else
up[k][i] = n + 1;
}
}
cin >> q;
while (q--) {
int L, R;
cin >> L >> R;
int cur = L - 1;
int ans = 0;
for (int k = LOG - 1; k >= 0; k--) {
if (up[k][cur] <= R) {
ans += (1 << k);
cur = up[k][cur];
}
}
cout << ans << '\n';
}
return 0;
}