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;
//ifstream f ("sumzero.in");
//ofstream g ("sumzero.out");
constexpr int NMAX = 4e5+3;
typedef long long LL;
int N;
int Root;
int L, R[NMAX];
int V[NMAX];
int First[NMAX];
int Last[NMAX];
int prev_Question[NMAX];
int Question[NMAX];
int D[NMAX];
int vf = 0;
void Read () {
cin >> N;
for (int i = 1; i <= N; ++ i )
cin >> V[i];
for (int i = N; i >= 1; -- i )
R[i] = R[i+1] + V[i];
sort(R+1, R+N+1+1);
int st = 1, dr = N+1;
int ind = 0;
while (st <= dr) {
int mij = (st + dr) / 2;
if (R[mij] == 0) {
dr = mij - 1;
ind = mij;
}
else if (R[mij] < 0) st = mij + 1;
else if (R[mij] > 0) dr = mij - 1;
}
D[ind] = N;
}
void Precalculare () {
Root = N + 2;
First[N+2] = N+1;
Last[N+2] = N+1;
int suff = 0;
int val = N+1;
for (int i = N; i >= 1; -- i ) {
suff += V[i];
int st = 1, dr = N+1;
int ind = 0;
while (st <= dr) {
int mij = (st + dr) / 2;
if (R[mij] == suff) {
dr = mij - 1;
ind = mij;
}
else if (R[mij] < suff) st = mij + 1;
else if (R[mij] > suff) dr = mij - 1;
}
int aux = D[ind];
if (aux != 0)
if (aux < val) {
val = aux;
First[val+1] = i;
}
Last[val+1] = i;
D[ind] = i-1;
}
}
void Dfs (int Node) {
if (Node == 0) return;
D[++vf] = Node;
int q = Question[Node];
while (q != 0) {
int val = R[q]+1;
int st = 1, dr = vf;
int pos = 1;
while (st <= dr) {
int mij = (st + dr) / 2;
if (D[mij] > val) {
pos = mij;
st = mij + 1;
}
else dr = mij - 1;
}
++ pos;
V[q] = vf - pos;
q = prev_Question[q];
}
for (int i = First[Node]; i >= Last[Node]; -- i )
Dfs(i);
--vf;
}
int Q;
void Solve () {
cin >> Q;
for (int i = 1; i <= Q; ++ i ) {
cin >> L >> R[i];
prev_Question[i] = Question[L];
Question[L] = i;
}
Dfs(Root);
for (int i = 1; i <= Q; ++ i )
cout << V[i] << '\n';
}
int main () {
Read();
Precalculare();
Solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |