Submission #1263409

#TimeUsernameProblemLanguageResultExecution timeMemory
1263409mine255Sum Zero (RMI20_sumzero)C++20
61 / 100
272 ms51608 KiB
#include <bits/stdc++.h> #define _FILE "TEMP" #define ll long long #define ii pair<ll,ll> #define fi first #define se second #define MASK(i) (1ll << (i)) #define BIT(x, i) (((x) >> (i)) & 1) using namespace std; int n; ll pre[400007]; vector<ll> b; int f[400007]; int up[400007][27]; int main() { ios_base::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); #ifdef EMERGENCY_DEBUG freopen(_FILE".inp","r",stdin); freopen(_FILE".out","w",stdout); #endif cin >> n; for (int i=1; i<=n; i++) { cin >> pre[i]; pre[i] += pre[i-1]; b.push_back(pre[i]); } sort(b.begin(),b.end()); b.resize(unique(b.begin(),b.end())-b.begin()); up[n+1][0] = INT_MAX; for (int i=n; i>0; i--) { up[i][0] = INT_MAX; int it1 = lower_bound(b.begin(),b.end(),pre[i]) - b.begin() + 1; int it2 = lower_bound(b.begin(),b.end(),pre[i-1]) - b.begin() + 1; f[it1] = i; if (f[it2] != 0) up[i][0] = f[it2]+1; up[i][0] = min(up[i][0],up[i+1][0]); } for (int j=1; j<=20; j++) { for (int i=1; i<=n+1; i++) { if (up[i][j-1] == INT_MAX || up[up[i][j-1]][j-1] == INT_MAX) up[i][j] = INT_MAX; else up[i][j] = up[up[i][j-1]][j-1]; } } int q; cin >> q; while (q--) { int l,r; cin >> l >> r; ll res = 0; for (int i=__lg(r-l+1)+1; i>=0; i--) { if (up[l][i] > r+1) continue; // cerr << l << ' ' << i << '\n'; res += MASK(i); l = up[l][i]; } cout << res << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...