#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
#define sz(x) static_cast<int>((x).size())
#define i5 tuple<int,int,int,int,int>
signed main(){
int n;cin>>n;
vector<int> v(n+1, 0), ps(n+1, 0);
for(int i=1;i<=n;i++){
cin>>v[i];
ps[i]=ps[i-1]+v[i];
}
map<int,int> m;
vector<vector<int>> up(n+1, vector<int>(20, -1));
vector<int> dp(n+2, 0);
int mnto=n+1;
for(int i=n;i>=0;i--){
int nxt=m[ps[i]];
if(nxt != 0) mnto=min(mnto, nxt);
m[ps[i]]=i;
up[i][0]=(mnto <= n ? mnto : -1);
}
//~ for(int i=0;i<=n;i++){
//~ cout<<up[i][0]<<" ";
//~ }
//~ cout<<endl;
//~ return 0;
int q;cin>>q;
for(int j=1;j<20;j++){
for(int i=0;i<=n;i++){
if(up[i][j-1] != -1)up[i][j]=up[up[i][j-1]][j-1];
}
}
//~ printf("up[0][1] is %lld\n", up[0][1]);
for(int qind=0;qind<q;qind++){
int a,b;cin>>a>>b;
a--;
int ans=0;
int cur=a;
for(int j=19;j>=0;j--){
//~ printf("up[%lld][%lld] = %lld]\n", cur, j, up[cur][j]);
if(up[cur][j] != -1 and up[cur][j] <= b){
ans+=(1<<j);
cur=up[cur][j];
}
}
cout<<ans<<'\n';
}
}
/*
10
1 2 -3 0 1 -4 3 2 -1 1
3
1 10
1 5
2 9
*/
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |