제출 #970804

#제출 시각아이디문제언어결과실행 시간메모리
970804lmaobruhSum Zero (RMI20_sumzero)C++14
61 / 100
378 ms50204 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int N = 4e5 + 5; int n, q, nxt[N], ku[N][19]; map<ll, int> mp; void build_rmq() { for (int i = 1; i <= n; ++i) ku[i][0] = nxt[i]; for (int j = 1; j <= 18; ++j) for (int i = 1; i + (1 << j) - 1 <= n; ++i) { if (ku[i][j - 1] == 0) { ku[i][j] = 0; continue; } ku[i][j] = ku[ku[i][j - 1] + 1][j - 1]; } } void build() { cin >> n; ll sum = 0, x; mp[0] = 0; for (int i = 1; i <= n; ++i) nxt[i] = -1; for (int i = 1; i <= n; ++i) { cin >> x; sum += x; if (mp.count(sum)) nxt[mp[sum] + 1] = i; mp[sum] = i; } mp.clear(); int pre = -1; for (int i = n; i >= 1; --i) { if (nxt[i] != -1) pre = (pre == -1 ? nxt[i] : min(pre, nxt[i])); else nxt[i] = 0; nxt[i] = (pre != -1 ? pre : 0); } build_rmq(); } int que(int l, int r) { int ans = 0; for (int i = 18; i >= 0; --i) if (l + (1 << i) - 1 <= n && ku[l][i] != 0 && ku[l][i] <= r) { // dbg(l, i, ku[l][i]); ans += 1 << i; l = ku[l][i] + 1; } return ans; } void ouput() { cin >> q; while (q--) { static int l, r; cin >> l >> r; cout << que(l, r) << '\n'; } } void solve() { build(); ouput(); } signed main() { cin.tie(0) -> sync_with_stdio(0); int tc = 1; // cin >> tc; for (; tc; --tc) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...