Submission #1033387

#TimeUsernameProblemLanguageResultExecution timeMemory
1033387Raul_ASum Zero (RMI20_sumzero)C++14
61 / 100
1059 ms20508 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define eb emplace_back
#define pii pair<int, int>
#define tpl tuple<int, int, int>
#define OO LLONG_MAX / 2
using namespace std;

int N;
vector<int> v,freq, nxt, jump, dp;
vector<ll> M, suff;

/*
    1 2 -3 0 1 -4 3 2 -1 1
    0 0 1 2 3 4 4 5 5 6 7

    1 2 -3
    1 2 -3 0
    0
    2 -3 0 1
    0 1 -4 3
    2 -3 0 1 -4 3 2 -1
    -1 1
*/

void read()
{
    cin >> N;

    v.resize(N + 1, 0);

    for (int i = 1; i <= N; i++)
        cin >> v[i];
}

void init()
{
    suff.resize(N + 5), M.resize(N + 5);
    for (int i = N; i >= 1; i--)
    {
        suff[i] = suff[i + 1] + v[i];
        M.eb(suff[i]);
    }

    sort(M.begin(), M.end());
    M.erase(unique(M.begin(), M.end()), M.end());

    freq.resize(N + 5);
    nxt.resize(N + 5);

    freq[upper_bound(M.begin(), M.end(), 0) - M.begin()] = N + 1;
    
    int pos = N + 2;
    for (int i = N; i >= 0; i--)
    {
        suff[i] = upper_bound(M.begin(), M.end(), suff[i]) - M.begin();

        if (freq[suff[i]])
            pos = min(pos, freq[suff[i]]);

        nxt[i] = pos;

        freq[suff[i]] = i;
    }

    jump.resize(N + 5), dp.resize(N + 5);
    for (int i = N; i >= 1; i--)
    {
        int father = nxt[i];
        jump[i] = father;
        dp[i] = 1;
        if (jump[jump[father]] - jump[father] == jump[father] - father)
        {
            jump[i] = jump[jump[father]];
            dp[i] = dp[father] + dp[jump[father]] + 1;
        }
    }
}

void queries()
{
    int Q, l, r;
    cin >> Q;
    while (Q--)
    {
        cin >> l >> r;

        int ans = 0;
        while (l <= r)
        {
            if (jump[l] <= r + 1)
            {
                ans += dp[l];
                l = jump[l];
            }
            else
            {
                if (nxt[l] <= r + 1)
                {
                    ++ans;
                    l = nxt[l];
                }
                else
                    l = r + 1;
            }
        }

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

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

    read();
    init();
    queries();
    exit(0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...