제출 #1130821

#제출 시각아이디문제언어결과실행 시간메모리
1130821VMaksimoski008Sum Zero (RMI20_sumzero)C++17
100 / 100
580 ms22436 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;

int n, a[maxn], q, up[maxn][4];

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

    cin >> n;
    for(int i=1; i<=n; i++) cin >> a[i];
    
    up[n+1][0] = n+2;
    up[n+2][0] = n+2;
    map<long long, int> mp; mp[0] = n+1;
    long long sum = 0;

    for(int i=n; i>=1; i--) {
        sum += a[i];
        up[i][0] = n+2;
        if(mp.count(sum)) up[i][0] = mp[sum];
        mp[sum] = i;
        if(i < n) up[i][0] = min(up[i][0], up[i+1][0]);
    }

    for(int i=1; i<4; i++) {
        for(int u=1; u<=n+2; u++) {
            up[u][i] = up[u][i-1];
            for(int j=0; j<31; j++)
                up[u][i] = up[up[u][i]][i-1];
        }
    }

    cin >> q;
    while(q--) {
        int l, r, ans = 0; cin >> l >> r;
        r++;

        for(int i=3; i>=0; i--) {
            for(int j=0; j<31; j++) {
                if(up[l][i] <= r) {
                    ans += (1 << ( 5 * i ));
                    l = up[l][i];
                } else break;
            }
        }

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

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