Submission #1140672

#TimeUsernameProblemLanguageResultExecution timeMemory
1140672azaylibelzSum Zero (RMI20_sumzero)C++17
0 / 100
64 ms76608 KiB
#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <iterator>
#include <stack>
#include <queue>
#include <set>

using namespace std;
typedef long long ll;
typedef long double ld;
const ll MOD = 1e9 + 7;
const ll lg = 4, maxn = 4e5 + 1, base = 32;
vector<vector<ll>> sparseTable(maxn, vector<ll>(lg));
vector<ll> power(lg);

signed main() {
    #ifndef ONLINE_JUDGE
        freopen("D:/C++ Project/test/seg-tre-e/LCA+BL/input.txt", "r", stdin);
    #endif // !ONLINE_JUDGE
    power[0] = 1;
    for (int i = 1; i < lg; i++) power[i] = base * power[i - 1];
    ll n; cin >> n;
    vector<ll> arr(n);
    for(ll i = 0; i < n; i++) cin >> arr[i];
    for(ll i = 0; i <= n + 1; i++) {
        for(ll j = 0; j < lg; j++) {
            sparseTable[i][j] = n + 1;
        }
    }
    ll sm = 0;
    vector<ll> pSum;
    pSum.push_back(0);
    for(ll i = n - 1; i >= 0; i--) {
        sm += arr[i];
        pSum.push_back(sm);
    }
    sort(pSum.begin(), pSum.end());
    pSum.resize(unique(pSum.begin(), pSum.end()) - pSum.begin());
    sm = 0;
    vector<ll> go(pSum.size(), n + 1);
    go[lower_bound(pSum.begin(), pSum.end(), sm) - pSum.begin()] = n;
    for(ll i = n - 1; i >= 0; i--) {
        sm += arr[i];
        sparseTable[i][0] = go[lower_bound(pSum.begin(), pSum.end(), sm) - pSum.begin()];
        go[lower_bound(pSum.begin(), pSum.end(), sm) - pSum.begin()] = i;
    }
    for(ll i = n - 2; i >= 0; i--) {
        sparseTable[i][0] = min(sparseTable[i][0], sparseTable[i + 1][0]);
    }
    for (ll j = 1; j < lg; j++) {
        for (ll i = 0; i < n; i++) {
            ll x = i;
            for(ll k = 0; k < base; k++) 
                x = sparseTable[x][j - 1];
            sparseTable[i][j] = x;
        }
    }
    ll q; cin >> q;
    for(ll i = 0; i < q; i++) {
        ll l, r, res = 0; cin >> l >> r; l--;
        ll x = lg - 1;
        while(x >= 0) {
            if(sparseTable[l][x] > r) x--;
            else {
                res += power[x];
                l = sparseTable[l][x];
            }
        }
        cout << res << "\n";
    }
    return 0;
}

Compilation message (stderr)

sumzero.cpp: In function 'int main()':
sumzero.cpp:24:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         freopen("D:/C++ Project/test/seg-tre-e/LCA+BL/input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...