# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
950195 | TrieTr | Sum Zero (RMI20_sumzero) | C++14 | 249 ms | 22044 KiB |
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;
void local() {
#define taskname "test"
if (fopen(taskname".inp", "r")) {
freopen(taskname".inp", "r", stdin);
freopen(taskname".out", "w", stdout);
}
}
#define ll long long
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
template<class X, class Y> bool mini(X &a, const Y &b) {return (a > b) ? a = b, true : false;}
template<class X, class Y> bool maxi(X &a, const Y &b) {return (a < b) ? a = b, true : false;}
const int N = 4e5 + 5;
const int LG = 19;
int n, q;
int arr[N];
map<ll, int> pos;
int nxt[N];
int depth[N];
bool vis[N];
int node_id[N], par[N], h[N], jump[N], cur_pos[N];
void make_leaf(int id, int p) {
par[id] = p;
h[id] = h[p] + 1;
if(h[jump[p]] - h[p] == h[jump[jump[p]]] - h[jump[p]]) jump[id] = jump[jump[p]];
else jump[id] = p;
}
int main() {
fastio; local();
cin >> n;
for(int i = 1; i <= n; i++) cin >> arr[i];
ll sum = 0;
nxt[n + 1] = n + 1;
pos[0] = n + 1;
for(int i = n; i > 0; i--) {
sum += arr[i];
nxt[i] = pos[sum] - 1;
if(nxt[i] == -1) nxt[i] = nxt[i + 1];
else mini(nxt[i], nxt[i + 1]);
pos[sum] = i;
}
cur_pos[0] = n + 1;
for(int i = n, id = 0; i > 0; i--) {
int u = nxt[i];
if(vis[u] || u > n) continue;
vis[u] = true; id++;
int p = node_id[nxt[u + 1]];
make_leaf(id, p);
node_id[u] = id; cur_pos[id] = u;
}
cin >> q;
while(q--) {
int l, r; cin >> l >> r;
l = nxt[l];
int id;
if(l <= r) id = node_id[l];
else {
cout << "0\n"; continue;
}
int res = 0;
while(cur_pos[id] <= r) {
//int tmp = id;
if(cur_pos[jump[id]] <= r) {
res += h[id] - h[jump[id]];
id = jump[id];
}
else {
res++;
id = par[id];
}
//cout << tmp << ' ' << id << ' ' << res << ' ' << cur_pos[0] << ' ' << ' ' << r << '\n';
}
cout << res << '\n';
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |