Submission #635473

#TimeUsernameProblemLanguageResultExecution timeMemory
635473danikoynovSum Zero (RMI20_sumzero)C++14
0 / 100
18 ms10068 KiB
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 4e5 + 10, maxlog = 19;

int n, q;
ll pref[maxn];
vector < int > g[maxn];
int s[maxn], tree[4 * maxn], timer, lvl[maxn], in[maxn];

void trav(int v, int p)
{
    s[++ timer] = v;
    in[v] = timer;
    for (int u : g[v])
    {
        if (u == p)
            continue;
            lvl[u] = lvl[v] + 1;
        trav(u, v);
    }
}

void make_tree(int root, int left, int right)
{
    ///cout << root << " - " << left << " - " << right << endl;
    if (left == right)
    {
        tree[root] = s[left];

        return;
    }

    int mid = (left + right) / 2;
    make_tree(root * 2, left, mid);
    make_tree(root * 2 + 1, mid + 1, right);

    tree[root] = max(tree[root * 2], tree[root * 2 + 1]);
}

int walk(int root, int left, int right, int qleft, int qright, int val)
{
///cout << root << " - " << left << " - " << right << endl;
    if (left > qright || right < qleft)
        return n + 1;

    int mid = (left + right) / 2;
    if (left >= qleft && right <= qright)
    {
        if (left == right)
        {
            if (tree[root] > val)
            {
                return tree[root];
            }
            else
                return n + 1;
        }

        if (tree[root * 2 + 1] > val)
            return walk(root * 2 + 1, mid + 1, right, qleft, qright, val);
        return walk(root * 2, left,  mid, qleft, qright, val);
    }


    int x = min(walk(root * 2, left, mid, qleft, qright, val),
               walk(root * 2 + 1, mid + 1, right, qleft, qright, val));

    return x;
}

void solve()
{
    cin >> n;
    ll x;
    for (int i = 1; i <= n; i ++)
    {
        cin >> x;
        pref[i] = pref[i - 1] + x;
    }

    map < int, int > last;
    int cl = n + 1;
    for (int i = n; i >= 0; i --)
    {
        if (last[pref[i]] != 0)
        cl = min(cl, last[pref[i]]);
        g[cl].push_back(i);
        //cout << i << " : " << cl << endl;
        last[pref[i]] = i;
    }

    trav(n + 1, -1);
    make_tree(1, 1, timer);
    /**for (int i = 1; i <= timer; i ++)
        cout << s[i] << " ";
    cout << endl;*/

    ///cout << walk(1, 1, timer, 1, in[2], 9) << endl;
    cin >> q;
    for (int i = 1; i <= q; i ++)
    {
        int l, r;
        cin >> l >> r;
        l = l - 1;
        int pos = walk(1, 1, timer, 1, in[l], r);
        cout << lvl[l] - lvl[pos]  - 1 << endl;
    }
}
int main()
{
    //freopen("input.txt", "r", stdin);
    solve();
   return 0;
}
/**

*/

Compilation message (stderr)

sumzero.cpp: In function 'void trav(int, int)':
sumzero.cpp:18:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   18 |         if (u == p)
      |         ^~
sumzero.cpp:20:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   20 |             lvl[u] = lvl[v] + 1;
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...