This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int maxN = 4e5 + 5;
int arr[maxN];
struct query_info
{
int l;
int r;
int idx;
} query[maxN];
bool cmp_query(const query_info &a, const query_info &b)
{
return a.l > b.l;
}
map<long long, int> helper;
map<long long, int>::iterator m_iter;
int lq[maxN], val[maxN];
int last_l;
int calc(const int &l, const int &r)
{
//cout << "Start " << l << ' ' << r << '\n';
if(r < l)return 0;
if(val[r])last_l = lq[r];
val[r] = val[r] + calc(l, lq[r] - 1);
lq[r] = (val[r] ? last_l : l);
//cout << " Calc " << l << ' ' << r << ' ' << val[r] << '\n';
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;
for(int i = 1; i <= n; ++i)
{
cin >> arr[i];
lq[i] = i;
val[i] = 0;
}
cin >> q;
for(int i = 1; i <= q; ++i)
{
cin >> query[i].l >> query[i].r;
query[i].idx = i;
}
sort(query + 1, query + q + 1, cmp_query);
helper.clear();
helper.insert(make_pair(0LL, n + 1));
long long sum = 0;
for(int i = n; i > 0; --i)
{
re[i] = -1;
sum += arr[i];
m_iter = helper.find(sum);
if(m_iter == helper.end())
{
helper.insert(make_pair(sum, i));
}
else
{
re[i] = m_iter->second - 1;
m_iter->second = i;
}
}
int itl = n;
for(int i = 1; i <= q; ++i)
{
while(itl >= query[i].l)
{
if(re[itl] != -1)
{
calc(itl, re[itl]);
if(!val[re[itl]])
{
val[re[itl]] = 1;
lq[re[itl]] = itl;
calc(itl, re[itl]);
for(int j = re[itl] + 1; j <= n; ++j)
if(val[j])break;
else
{
lq[j] = re[itl] + 1;
//cout << "Set lq of " << j << " to " << re[itl] + 1 << '\n';
}
}
}
itl--;
}
res[query[i].idx] = calc(query[i].l, query[i].r);
}
for(int i = 1; i <= q; ++i)
cout << res[i] << '\n';
return 0;
}
Compilation message (stderr)
sumzero.cpp: In function 'int main()':
sumzero.cpp:42:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
42 | freopen("input.txt", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |