Submission #1279676

#TimeUsernameProblemLanguageResultExecution timeMemory
1279676rayan_bdSum Zero (RMI20_sumzero)C++20
0 / 100
3 ms1080 KiB
#include <bits/stdc++.h>
using namespace std;
const int mxN = 4e5 + 100;

int a[mxN], dp[mxN][27];

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);

    int n, l, r, q;
    cin >> n;

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

    cin >> q;

    map<int, int> mp;

    mp[0] = n + 1;

    // 0 1 2 -3 100
    //

    int last = 0;

    for(int i = n, sum = 0; i >= 1; --i){
        sum += a[i];
        if(mp.count(sum)){
            dp[i][0] = mp[sum];
            last = dp[i][0];
        }else{
            dp[i][0] = last;
        }
        mp[sum] = i;
    }

    for(int i = n; i >= 1; --i){
        for(int j = 1; j < 26; ++j){
            dp[i][j] = dp[dp[i][j - 1]][j - 1];
        }
    }

    auto query = [&](int l, int r){
        int ans = 0;
        for(int i = 25; i >= 0; --i){
            if(dp[l][i] > l && dp[l][i] == (r + 1)){
                ans += (1ll << i);
                break;
            }else if(dp[l][i] > l && dp[l][i] <= r){
                l = dp[l][i];
                ans += (1ll << i);
            }
        }
        return ans;
    };

    while(q--){
        cin >> l >> r;
        cout << query(l, r) << "\n";
    }

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