Submission #1297465

#TimeUsernameProblemLanguageResultExecution timeMemory
1297465ThunnusSum Zero (RMI20_sumzero)C++20
100 / 100
400 ms20880 KiB
#include<bits/stdc++.h> #pragma GCC optimize("unroll-loops,O3") using namespace std; using i64 = long long; //#define int i64 #define vi vector<int> #define vvi vector<vi> #define vb vector<bool> #define se second #define fi first #define pii pair<int, int> #define sz(x) (int)(x).size() const int LG = 20; inline void solve(){ int n, q; cin >> n; vi a(n); for(int i = 0; i < n; i++){ cin >> a[i]; } map<i64, int> sufi; sufi[0] = n - 1; i64 s = 0; vvi lift(2, vi(n + 2)); vi go(n + 2); go[n] = go[n + 1] = lift[0][n] = lift[0][n + 1] = n + 1; for(int i = n - 1; i >= 0; i--){ s += a[i]; a.pop_back(); if(sufi.count(s)){ lift[0][i] = sufi[s] + 1; } else{ lift[0][i] = n + 1; } sufi[s] = i - 1; go[i] = lift[0][i] = min(lift[0][i], lift[0][i + 1]); //cout << "i: " << i << " go: " << lift[i][0] << " s: " << s << "\n"; } sufi.clear(); cin >> q; vector<pii> queries(q); vi ans(q); auto checklg = [&](int lg) -> void { lift[0] = go; for(int bit = 1; bit <= lg; bit++){ for(int v = n + 1; v >= 0; v--){ lift[1][v] = lift[0][lift[0][v]]; if(v <= n) lift[1][v] = min(lift[1][v], lift[1][v + 1]); } lift[0].swap(lift[1]); } for(int i = 0; i < q; i++){ if(lift[0][queries[i].fi] - 1 <= queries[i].se){ queries[i].fi = lift[0][queries[i].fi]; ans[i] |= (1 << lg); } } return; }; for(int i = 0; i < q; i++){ int l, r; cin >> l >> r; l--, r--; queries[i] = {l, r}; } for(int bit = LG - 1; bit >= 0; bit--){ checklg(bit); } for(int i = 0; i < q; i++){ cout << ans[i] << "\n"; } return; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; //cin >> t; while(t--){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...