Submission #1352917

#TimeUsernameProblemLanguageResultExecution timeMemory
1352917bakhtiyarnSum Zero (RMI20_sumzero)C++20
61 / 100
278 ms54780 KiB
// GPT'S code
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 400000 + 5;
const int LOG = 20;

int n, q;
ll c[MAXN];
ll p[MAXN];                  // prefix sums
int pre[MAXN];               // previous occurrence
int nxt[MAXN];               // next jump
int up[LOG][MAXN];           // binary lifting

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for (int i = 1; i <= n; i++) cin >> c[i];

    // prefix sums
    p[0] = 0;
    for (int i = 1; i <= n; i++) p[i] = p[i-1] + c[i];

    // compute pre[i]
    unordered_map<ll, int> last;
    last.reserve(n * 2);
    last.max_load_factor(0.7);

    for (int i = 0; i <= n; i++) {
        if (last.count(p[i])) pre[i] = last[p[i]];
        else pre[i] = -1;
        last[p[i]] = i;
    }

    // build nxt
    for(int i=0; i<=n; i++){
        nxt[i] = n+1;
        for(int j=i+1; j<=n; j++){
            if(pre[j] >= i) {nxt[i] = j; break;}
        }
    }
    
    // binary lifting
    for (int i = 0; i <= n; i++) up[0][i] = nxt[i];
    for (int k = 1; k < LOG; k++) {
        for (int i = 0; i <= n; i++) {
            if (up[k-1][i] <= n)
                up[k][i] = up[k-1][ up[k-1][i] ];
            else
                up[k][i] = n + 1;
        }
    }

    cin >> q;
    while (q--) {
        int L, R;
        cin >> L >> R;

        int cur = L - 1;
        int ans = 0;

        for (int k = LOG - 1; k >= 0; k--) {
            if (up[k][cur] <= R) {
                ans += (1 << k);
                cur = up[k][cur];
            }
        }

        cout << ans << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...