Submission #944961

#TimeUsernameProblemLanguageResultExecution timeMemory
944961vjudge1Sum Zero (RMI20_sumzero)C++14
61 / 100
245 ms26392 KiB
#include <bits/stdc++.h> using namespace std; const int maxN = 4e5 + 5; long long query[maxN]; long long get_l(const long long &num) { return num & ((1LL << 19) - 1LL); } long long get_r(const long long &num) { return (num >> 19) & ((1LL << 19) - 1LL); } long long get_idx(const long long &num) { return (num >> 38) & ((1LL << 19) - 1LL); } bool cmp_query(const long long &a, const long long &b) { return get_l(a) > get_l(b); } vector<pair<long long, int> > helper; vector<pair<long long, int> >::iterator v_iter; int S[maxN + 5], S_si = 0; int lq[maxN], val[maxN]; int last_l; int calc(const int &l, const int &r) { S_si = 0; int tr = r; while(l <= tr) { if(val[tr])last_l = lq[tr]; S[S_si++] = tr; tr = lq[tr] - 1; } int pr = l - 1; while(S_si) { val[S[S_si-1]] += val[pr]; //cout << "Calc " << l << ' ' << S.back() << ' ' << val[S.back()] << '\n'; lq[S[S_si-1]] = (val[S[S_si-1]] ? last_l : l); pr = S[S_si-1]; S_si--; } return val[r]; } int re[maxN]; int res[maxN]; int n, q; int main() { if(fopen("input.txt", "r")) { freopen("input.txt", "r", stdin); } ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; val[0] = 0; for(int i = 1; i <= n; ++i) { cin >> re[i]; lq[i] = i; val[i] = 0; } cin >> q; long long l, r, idx; for(int i = 1; i <= q; ++i) { cin >> l >> r; idx = i; query[i] = l | (r << 19) | (idx << 38); } sort(query + 1, query + q + 1, cmp_query); long long sum = 0; for(int i = n; i > 0; --i) { sum += re[i]; helper.push_back(make_pair(sum, i)); } helper.push_back(make_pair(0, n + 1)); sort(helper.begin(), helper.end()); sum = 0; for(int i = n; i > 0; --i) { sum += re[i]; re[i] = -1; v_iter = upper_bound(helper.begin(), helper.end(), make_pair(sum, i)); if(v_iter != helper.end() && v_iter->first == sum) re[i] = v_iter->second - 1; } /**------------**/ int itl = n; for(int i = 1; i <= q; ++i) { while(itl >= get_l(query[i])) { if(re[itl] != -1) { calc(itl, re[itl]); if(!val[re[itl]]) { val[re[itl]] = 1; lq[re[itl]] = itl; for(int j = re[itl] + 1; j <= n; ++j) if(val[j])break; else lq[j] = re[itl] + 1; } } itl--; } res[get_idx(query[i])] = calc(get_l(query[i]), get_r(query[i])); } for(int i = 1; i <= q; ++i) cout << res[i] << '\n'; return 0; }

Compilation message (stderr)

sumzero.cpp: In function 'int main()':
sumzero.cpp:61:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...