제출 #857711

#제출 시각아이디문제언어결과실행 시간메모리
857711alexdumitruSum Zero (RMI20_sumzero)C++14
100 / 100
235 ms13648 KiB
#include <bits/stdc++.h> using namespace std; const int kN = 4e5; int nxt[1 + kN], jump[1 + kN + 1 + 1]; int64_t sum[1 + kN]; int L[1 + kN], R[1 + kN], ANS[1 + kN]; void testCase() { int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> sum[i]; sum[i] += sum[i - 1]; } multiset<int64_t> sums{0}; int r = 0; for (int l = 1; l <= n; ++l) { while (r <= n) { if (sums.count(sum[r]) >= 2) { break; } r += 1; sums.emplace(sum[r]); } nxt[l] = r + 1; sums.erase(sums.find(sum[l - 1])); } int Q; cin >> Q; for (int i = 1; i <= Q; ++i) { cin >> L[i] >> R[i]; ANS[i] = 0; } jump[n + 1] = jump[n + 2] = n + 2; for (int j = log2(n); j >= 0; --j) { for (int i = 1; i <= n; ++i) { jump[i] = nxt[i]; } for (int rep = 1; rep <= j; ++rep) { for (int i = 1; i <= n; ++i) { jump[i] = jump[jump[i]]; } } for (int i = 1; i <= Q; ++i) { if (jump[L[i]] <= R[i] + 1) { ANS[i] += (1 << j); L[i] = jump[L[i]]; } } } for (int i = 1; i <= Q; ++i) { cout << ANS[i] << '\n'; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int tests = 1; for (int tc = 1; tc <= tests; ++tc) { testCase(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...