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 <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 5*1e5+5, INF = 4e18+9;
int n, m, Q, N;
struct creature{
ll x, v;
};
creature a[maxn];
void inp(){
cin >> n;
m = 0;
for(int i = 1; i <= n; i++){
cin >> a[i].v;
a[i].x = i;
}
for(int i = n+1; i <= n+m; i++){
cin >> a[i].x >> a[i].v;
a[i].v*=-1;
}
cin >> Q;
N = n+m;
}
bool cmp(creature a, creature b){
return a.x < b.x;
}
map<ll, ll> mp;
int up[maxn][22];
void solve(){
vector<ll> v;
sort(a+1, a+1+N, cmp);
for(int i = 1; i <= N; i++){
v.push_back(1);
//cout << a[i].v << " ";
}
// cout << "\n";
ll sum = 0;
for(int j = 0; j < 20; j++){
for(int i = 0; i <= N; i++){
up[i][j] = N+1;
}
}
mp[0] = 0;
for(int i = 1; i <= N; i++){
sum += a[i].v;
if(mp.count(sum)) up[mp[sum]][0] = i;
mp[sum] = i;
}
for(int i = N-1; i >= 0; i--){
if(up[i][0] > up[i+1][0]){
up[i][0] = up[i+1][0];
}
}
for(int j = 1; j < 20; j++){
for(int i = 0; i <= N; i++){
int k = i;
for(int t = 0; t < 20; t++){
if(k <= N){
k = up[k][j-1];
}
}
up[i][j] = k;
}
}
int x, y;
while(Q--){
cin >> x >> y;
int l = lower_bound(v.begin(), v.end(), x) - v.begin()+1, r = upper_bound(v.begin(), v.end(), y)-v.begin();
// cout << l << " " << r << "\n";
int k = l-1, t = 19, res = 0;
while(t >= 0){
if(up[k][t] <= r){
k = up[k][t];
res += (1<<(4*t));
}else{
t--;
}
}
cout << res << "\n";
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
inp();
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |