#include <bits/stdc++.h>
using namespace std;
#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>
vector<pair<int,int>> qs[400005];
signed main(){
int n;cin>>n;
vector<int> ps(n+1, 0);
for(int i=1;i<=n;i++){
int c;cin>>c;
ps[i]=ps[i-1]+c;
}
map<int,int> m;
int mnto=n+1;
vector<vector<int>> ch(n+2);
for(int i=n;i>=0;i--){
int nxt=m[ps[i]];
if(nxt != 0) mnto=min(mnto, nxt);
m[ps[i]]=i;
int up=(mnto <= n ? mnto : n+1);
ch[up].pb(i);
//~ printf("i %d, up %d\n", i, up[i]);
}
//~ for(int i=0;i<=n;i++){
//~ cout<<up[i][0]<<" ";
//~ }
//~ cout<<endl;
//~ return 0;
int q;cin>>q;
//~ printf("up[0][1] is %lld\n", up[0][1]);
m.clear();
ps.resize(0);
vector<int> ans(q+1, 0);
for(int qind=0;qind<q;qind++){
int a,b;cin>>a>>b;
qs[a-1].pb({b, qind});
}
vector<int> st;
auto dfs=[&](auto && dfs, int x)->void{
st.pb(x);
//~ cout<<x<<endl;
for(auto [en, qind] : qs[x]){
ans[qind]=st.end()-1-lower_bound(st.begin(),st.end(),en,greater<int>());
}
for(auto it: ch[x]){
dfs(dfs, it);
}
st.pop_back();
};
dfs(dfs, n+1);
for(int i=0;i<q;i++){
cout<<ans[i]<<"\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... |