#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + 5, LG = 12, C = 5;
int n, q, last[N], par[N][2], store[N][C];
ll sm;
vector<pair<ll, int>> vec;
int i, j, x;
int jump, l, r, cur, ans, nxt;
bool cmp(pair<ll, int> &a, pair<ll, int> &b){
return (a.second < b.second);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
memset(last, -1, sizeof last);
cin >> n;
for (i = 1; i <= n + 2; i ++)
par[i][0] = n + 2;
vec.resize(n + 1);
vec[0] = {sm, 0};
for (i = 1, x; i <= n; i ++){
cin >> x;
sm += x;
vec[i] = {sm, i};
}
sort(vec.begin(), vec.end());
for (i = 0, r, j; i <= n; i ++){
r = i;
while (r <= n and vec[r].first == vec[i].first)
r++;
for (j = i; j < r; j ++)
vec[j].first = i;
i = r - 1;
}
sort(vec.begin(), vec.end(), cmp);
last[vec[0].first] = 0;
for (i = 1; i <= n; i ++){
if (last[vec[i].first] != -1) par[last[vec[i].first] + 1][0] = i + 1;
last[vec[i].first] = i;
}
for (i = n; i > 0; i --)
par[i][0] = min(par[i][0], par[i + 1][0]);
for (i = 1; i <= n + 2; i ++)
store[i][0] = par[i][0];
for (j = 1, i; j < LG; j ++){
for (i = 1; i <= n + 2; i ++){
par[i][1] = par[par[i][0]][0];
par[i][0] = par[i][1];
if (j < C) store[i][j] = par[i][1];
}
}
cin >> q;
while (q--){
l, r;
cin >> l >> r;
cur = l, ans = 0;
for (jump = LG - 1; jump >= 0; jump --){
if (jump != LG - 1 and jump >= C) continue;
if (jump == LG - 1) nxt = par[cur][1];
else nxt = store[cur][jump];
if (nxt <= r + 1){
cur = nxt;
ans += (1 << jump);
if (jump == LG - 1 or jump == C - 1)
jump++;
}
}
cout << ans << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |