Submission #517113

#TimeUsernameProblemLanguageResultExecution timeMemory
517113StickfishSum Zero (RMI20_sumzero)C++17
22 / 100
1075 ms6832 KiB
#include <iostream>
#include <cassert>
#include <map>
#include <vector>
#include <bitset>
using namespace std;
using ll = long long;
#define endl '\n'

const int MAXN = 400000;
int a[MAXN];

struct stree {
    void assign(int n) {
        sz = n;
        t.resize(sz * 2 - 1);
        assign(0, 0, sz);
    }

    int get(int l, int r) {
        pair<int, int> ans = get(0, 0, sz, l, r);
        if (ans.first + 1 < l)
            return ans.second - 1;
        return ans.second;
    }
 private:
     int sz;
     vector<pair<int, int>> t;

     vector<pair<int, int>> assign(int ind, int lnd, int rnd) {
         if (rnd - lnd == 1) {
             t[ind] = {a[lnd], 1};
             //cout << lnd << ' ' << rnd << ": " << t[ind].first << ' ' << t[ind].second;
             return {t[ind]};
         }
         int mnd = (lnd + rnd) / 2;
         int chd = ind + (mnd - lnd) * 2;
         vector<pair<int, int>> vl = assign(ind + 1, lnd, mnd);
         vector<pair<int, int>> vr = assign(chd, mnd, rnd);
         for (auto [j, cnt] : vr) {
             if (j < lnd)
                 vl.push_back({j, cnt});
             else
                 vl.push_back({vl[j - lnd].first, cnt + vl[j - lnd].second});
         }
         t[ind] = vl.back();
         vr.clear();
         return vl;
     }

     pair<int, int> get(int ind, int lnd, int rnd, int l, int r) {
         if (l <= lnd && rnd <= r) {
             return t[ind];
         }
         int mnd = (lnd + rnd) / 2;
         if (mnd >= r) {
             return get(ind + 1, lnd, mnd, l, r);
         }
         int chd = ind + (mnd - lnd) * 2;
         pair<int, int> p = get(chd, mnd, rnd, l, r);
         if (p.first >= lnd && p.first >= l) {
             pair<int, int> q = get(ind + 1, lnd, mnd, l, p.first + 1);
             return {q.first, q.second + p.second};
         } else {
             return p;
         }
     }
};

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    map<ll, int> mp;
    mp[0] = -1;
    ll psm = 0;
    for (int i = 0; i < n; ++i) {
        psm += a[i];
        if (mp.find(psm) == mp.end()) {
            a[i] = -2;
        } else {
            a[i] = mp[psm];
        }
        if (i && a[i - 1] > a[i]) {
            a[i] = a[i - 1];
        }
        mp[psm] = i;
    }
    stree tr;
    tr.assign(n);
    mp.clear();
    int q;
    cin >> q;
    while (q--) {
        int l, r;
        cin >> l >> r;
        --l;
        cout << tr.get(l, r) << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...