# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
950165 | TrieTr | Sum Zero (RMI20_sumzero) | C++14 | 3 ms | 6748 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 ""
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 = 1e6 + 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 - 1, 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;
}
/*for(int i = 1; i <= n; i++) {
int id = node_id[i];
cout << i << ' ' << id << ' ' << par[id] << ' ' << h[id] << ' ' << jump[id] << ' ' << cur_pos[id] << '\n';
}*/
cin >> q;
while(q--) {
int l, r; cin >> l >> r;
l = nxt[l];
int res = 0, id;
if(l <= r) id = node_id[l];
int cnt = 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 << ' ' << h[tmp] << ' ' << h[id] << ' ' << res << '\n';
//cnt++; if(cnt > 3) break;
}
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... |