Submission #1263305

#TimeUsernameProblemLanguageResultExecution timeMemory
1263305rshohruhSum Zero (RMI20_sumzero)C++20
0 / 100
3 ms832 KiB
// rshohruh

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define ll long long

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

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

    vector<int> up0(n+1, -1); // only direct jumps
    map<ll,int> mp;
    mp[0] = 0;
    ll pref = 0;
    int id = -1;
    for(int i = 1; i <= n; i++){
        pref += a[i];
        if(mp.count(pref)) id = max(id, mp[pref]);
        up0[i] = id;
        mp[pref] = i;
    }

    // lazy higher jumps
    const int LOG = 20;
    vector<vector<int>> up(LOG, vector<int>(n+1, -2));
    for(int i = 0; i <= n; i++) up[0][i] = up0[i];

    auto getUp = [&](auto self, int j, int i) -> int {
        if(i == -1) return -1;
        if(up[j][i] != -2) return up[j][i]; // cached
        int half = self(self, j-1, i);
        if(half == -1) return up[j][i] = -1;
        return up[j][i] = self(self, j-1, half);
    };

    int q; cin >> q;
    while(q--){
        int l, r; cin >> l >> r;
        int ans = 0;
        for(int j = LOG-1; j >= 0; j--){
            int nxt = getUp(getUp, j, r);
            if(nxt >= l){
                ans += (1<<j);
                r = nxt;
            }
        }
        cout << ans << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...