Submission #1225699

#TimeUsernameProblemLanguageResultExecution timeMemory
1225699Ghulam_JunaidSum Zero (RMI20_sumzero)C++20
100 / 100
666 ms21328 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 4e5 + 5, LG = 12, C = 5;
int n, q, last[N], par[N][2], store[N][C];
ll sm;
vector<pair<ll, int>> vec;

int i, j, x;
int jump, l, r, cur, ans, nxt;

bool cmp(pair<ll, int> &a, pair<ll, int> &b){
    return (a.second < b.second);
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    memset(last, -1, sizeof last);

    cin >> n;
    for (i = 1; i <= n + 2; i ++)
        par[i][0] = n + 2;
    
    vec.resize(n + 1);
    vec[0] = {sm, 0};
    for (i = 1, x; i <= n; i ++){
        cin >> x;
        sm += x;
        vec[i] = {sm, i};
    }
    sort(vec.begin(), vec.end());

    for (i = 0, r, j; i <= n; i ++){
        r = i;
        while (r <= n and vec[r].first == vec[i].first)
            r++;
        for (j = i; j < r; j ++)
            vec[j].first = i;
        i = r - 1;
    }
    sort(vec.begin(), vec.end(), cmp);

    last[vec[0].first] = 0;
    for (i = 1; i <= n; i ++){
        if (last[vec[i].first] != -1) par[last[vec[i].first] + 1][0] = i + 1;
        last[vec[i].first] = i;
    }

    for (i = n; i > 0; i --)
        par[i][0] = min(par[i][0], par[i + 1][0]);
    for (i = 1; i <= n + 2; i ++)
        store[i][0] = par[i][0];

    for (j = 1, i; j < LG; j ++){
        for (i = 1; i <= n + 2; i ++){
            par[i][1] = par[par[i][0]][0];
            par[i][0] = par[i][1];
            if (j < C) store[i][j] = par[i][1];
        }
    }

    cin >> q;
    while (q--){
        l, r;
        cin >> l >> r;

        cur = l, ans = 0;
        for (jump = LG - 1; jump >= 0; jump --){
            if (jump != LG - 1 and jump >= C) continue;
            if (jump == LG - 1) nxt = par[cur][1];
            else nxt = store[cur][jump];
            if (nxt <= r + 1){
                cur = nxt;
                ans += (1 << jump);
                if (jump == LG - 1 or jump == C - 1)
                    jump++;
            }
        }
        cout << ans << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...