#include <bits/stdc++.h>
using namespace std;
const int mxN = 4e5 + 100;
int a[mxN], dp[mxN][27];
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
int n, l, r, q;
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
cin >> q;
map<int, int> mp;
mp[0] = n + 1;
// 0 1 2 -3 100
//
int last = 0;
for(int i = n, sum = 0; i >= 1; --i){
sum += a[i];
if(mp.count(sum)){
dp[i][0] = mp[sum];
last = dp[i][0];
}else{
dp[i][0] = last;
}
mp[sum] = i;
}
for(int i = n; i >= 1; --i){
for(int j = 1; j < 26; ++j){
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
}
auto query = [&](int l, int r){
int ans = 0;
for(int i = 25; i >= 0; --i){
if(dp[l][i] > l && dp[l][i] == (r + 1)){
ans += (1ll << i);
break;
}else if(dp[l][i] > l && dp[l][i] <= r){
l = dp[l][i];
ans += (1ll << i);
}
}
return ans;
};
while(q--){
cin >> l >> r;
cout << query(l, r) << "\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |