Submission #1171611

#TimeUsernameProblemLanguageResultExecution timeMemory
1171611quannnguyen2009Sum Zero (RMI20_sumzero)C++20
61 / 100
292 ms27232 KiB
#include<bits/stdc++.h>
// #define int long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()
using namespace std;

const int N=4e5+5, mod = 1e9+7;

int n, q;
pair<long long, int> a[N];

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i=1; i<=n; i++) {
        cin >> a[i].fi;
        a[i].fi += a[i-1].fi;
        a[i].se = i;
    }
    sort(a, a+n+1);
    int L = 12;
    int up[n+2][L];
    up[n+1][0] = n+1;
    a[n+1].fi = 100000000000000000;
    for (int i=0; i<=n; i++) {
        if(a[i].fi==a[i+1].fi) up[a[i].se][0] = a[i+1].se;
        else up[a[i].se][0] = n+1;
    }
    for (int i=n; i>=0; i--) up[i][0] = min(up[i][0], up[i+1][0]);
    for (int i=1; i<L; i++) {
        up[n+1][i] = n+1;
        for (int j=0; j<=n; j++) up[j][i] = up[up[j][i-1]][i-1];
    }
    cin >> q;
    while(q--) {
        int l, r; cin >> l >> r;
        int idx = l-1;
        long long ans = 0;
        for (int i=L-1; i>=0; i--) {
            while(up[idx][i]<=r) {
                idx = up[idx][i];
                ans += (1LL<<i);
            }
        }
        cout << ans << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...