Submission #1118393

#TimeUsernameProblemLanguageResultExecution timeMemory
1118393somefolkSum Zero (RMI20_sumzero)C++14
61 / 100
922 ms21620 KiB
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

void solve(){
    int n;
    cin >> n;
    vector<int> a(n);

    int k = 300; // aprox sqrt(n)

    for(int i = 0; i < n; i++){
        cin >> a[i];
    }

    vector<int> idx(n);
    for(int i = 0; i < n+1; i++){
        idx[i] = n+1;
    }

    unordered_map<int, int> mp;
    mp[0] = n;
    int s = 0;
    for(int i = n-1; i >= 0; i--){
        s += a[i];
        if(mp.count(s)) idx[i] = mp[s];
        mp[s] = i;
    }
    mp.clear();

    int curr = n+1;
    for(int i = n-1; i >= 0; i--){
        if(idx[i] > -1){
            curr = min(curr, idx[i]);
        }
        idx[i] = curr;
    }

    vector<int> valid(n);
    for(int i = 0; i < n; i++){
        curr = i;
        for(int j = 0; j < k && curr <= n; j++){
            curr = idx[curr];
        }
        valid[i] = curr;
    }

    int m;
    cin >> m;
    while(m--){
        int l, r;
        cin >> l >> r;
 
        curr = l-1;
        int sol = 0;
        while(valid[curr] <= r){
            sol += k;
            curr = valid[curr];
        }
        while(idx[curr] <= r){
            sol++;
            curr = idx[curr];
        }

        cout << sol << "\n";
    }
}

int32_t main(){
    ios_base::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...