이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, d;
vector<int> a;
vector<int> left_low;
vector<vector<pair<int, int>>> bl;
vector<int> cumul;
void precalc(){
vector<int> st;
a[0] = 0;
left_low.resize(n+1);
for(int i = n; i>=0; i--){
while(st.size()>0 && a[st.back()]>=a[i]){
left_low[st.back()] = i;
st.pop_back();
}
st.push_back(i);
}
left_low[0] = 0;
bl.resize(20);
for(int i = 0; i<20; i++){
bl[i].resize(n+1);
}
for(int i = 0; i<=n; i++){
bl[0][i] = {left_low[i], a[i] * (i-left_low[i])};
}
for(int step = 1; step<20; step++){
for(int i = 0; i<=n; i++){
auto lh = bl[step-1][bl[step-1][i].first];
bl[step][i]={lh.first, lh.second + bl[step-1][i].second};
}
}
}
int Bs(int cur, int lim){
int res = 0;
for(int step = 19; step>=0; step--){
if(bl[step][cur].first>=lim){
res += bl[step][cur].second;
cur = bl[step][cur].first;
}
}
if(cur>lim){
res += (cur-lim) * a[cur];
}
return res;
}
signed main(){
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin>>n>>d;
a.resize(n+1);
cumul.resize(n+1);
cumul[0] = 0;
for(int i = 1; i<=n; i++){
cin>>a[i];
cumul[i] = cumul[i-1] + a[i];
}
precalc();
int q;
cin>>q;
for(int i =0; i<q; i++){
int l, r;
cin>>l>>r;
cout<<cumul[r]-cumul[l-1]-Bs(r, l-1)<<endl;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |