Submission #1173805

#TimeUsernameProblemLanguageResultExecution timeMemory
1173805therickyzhangSum Zero (RMI20_sumzero)C++20
61 / 100
1094 ms20676 KiB
#include <bits/stdc++.h>
using namespace std;

#define tpl_ template
#define tn_ typename
#define f(i, to) for (int i = 0; i < (to); ++i)
#define fe(i, to) for (int i = 1; i <= (to); ++i)
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define repr(i, a, b) for (int i = (a); i >= (b); --i)
#define ff first
#define ss second
#define pb push_back
#define trav(a, x) for (auto &a : x)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define setIO(name) ifstream cin(name".in"); ofstream cout(name".out");

// #define int long long
tpl_<tn_ T>        using v = vector<T>;  using ll=long long;  using pii=pair<int,int>;  using pll=pair<ll,ll>;  using iii=tuple<int,int,int>;       using t4=tuple<int,int,int,int>;
using vi=v<int>;   using vb=v<bool>;     using vvb=v<vb>;     using vs=v<string>;       using vvi=v<vi>;        using vll=v<ll>;using vvll=v<vll>; using vpii=v<pii>; using vvpii=v<vpii>; using vpll=v<pll>; using vvpll=v<vpll>;
tpl_<class T, class U> T fstTrue(T l, T r, U ff) { for(++r; l < r;) { T m = l+(r-l) / 2; if(ff(m)) r = m; else l = m+1; } return l; }
tpl_<class T, class U> T lstTrue(T l, T r, U ff) { for(++r; l < r;) { T m = l+(r-l) / 2; if(ff(m)) l = m+1; else r = m; } return l-1; }
tpl_<class T> bool       ckmn(T& a, const T& b) {return b < a ? a = b, 1 : 0;}  tpl_<class T> bool ckmx(T& a, const T& b) {return a < b ? a = b, 1 : 0;}
#define str string
    constexpr int N = 4e5+5; int MOD=1e9+7; constexpr int INF=1e9; ll INFL=0x3f3f3f3f3f3f3f3f; constexpr auto en = "\n"; constexpr auto sp = " ";

constexpr int LG = 8;
int n;
long long prf[N];
int ord[N];
int up[N][LG+1];

void solve(){
    cin>>n;
    prf[0] = 0;
    ord[0] = 0;
    fe(i, n) {
        int x; cin>>x;
        prf[i] = prf[i-1]+x;
        ord[i] = i;
    }
    sort(ord, ord+n+1, [](const int &x, const int &y) {
        return (prf[x] != prf[y] ? prf[x] < prf[y] : x < y);
    });
    
    up[n+1][0] = n+2;
    up[n+2][0] = n+2;
    fe(i, n) up[i][0] = n+2;
    
    rep(i, 0, n) {
        int cur = 0;
        while (i+cur <= n && prf[ord[i]] == prf[ord[i+cur]]) cur++;
        for (int j = i+1; j < i+cur; j++) {
            up[ord[j-1]+1][0] = min(up[ord[j-1]+1][0], ord[j]+1);
        }
        i += cur - 1;
    }
    
    repr(i, n, 1) ckmn(up[i][0], up[i+1][0]);
    fe(i, LG) {
        rep(u, 1, n+2) {
            up[u][i] = up[ up[u][i-1] ][i-1];
        }
    }
    
    int q; cin>>q;
    while(q--) {
        int l, r; cin>>l>>r;
        int res = 0;
        while (up[l][LG] <= r+1) {
            res += (1<<LG);
            l = up[l][LG];
        }
        repr(i, LG, 0) {
            if (up[l][i] <= r+1) {
                res += (1<<i);
                l = up[l][i];
            }
        }
        cout<<res<<en;
    }
}
 
int32_t main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...