이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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);
}
map<long long, int> helper;
map<long long, int>::iterator m_iter;
stack<int> S;
int lq[maxN], val[maxN];
int last_l, tr, pr;
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);
helper.clear();
helper.insert(make_pair(0LL, n + 1));
long long sum = 0;
for(int i = n; i > 0; --i)
{
sum += re[i];
re[i] = -1;
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 >= get_l(query[i]))
{
if(re[itl] != -1)
{
//calc(itl, re[itl]);
tr = re[itl];
while(itl <= tr)
{
if(val[tr])last_l = lq[tr];
S.push(tr);
tr = lq[tr] - 1;
}
pr = itl - 1;
while(!S.empty())
{
val[S.top()] += val[pr];
lq[S.top()] = (val[S.top()] ? last_l : itl);
pr = S.top();
S.pop();
}
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--;
}
tr = get_r(query[i]);
while(get_l(query[i]) <= tr)
{
if(val[tr])last_l = lq[tr];
S.push(tr);
tr = lq[tr] - 1;
}
pr = get_l(query[i]) - 1;
while(!S.empty())
{
val[S.top()] += val[pr];
lq[S.top()] = (val[S.top()] ? last_l : get_l(query[i]));
pr = S.top();
S.pop();
}
res[get_idx(query[i])] = val[get_r(query[i])];
}
for(int i = 1; i <= q; ++i)
cout << res[i] << '\n';
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
sumzero.cpp: In function 'int main()':
sumzero.cpp:40:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
40 | 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... |