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>
#define rep(i, a, b) for(int i=(a) ; i<=(b) ; ++i)
#define mp make_pair
#define pii pair<int, int>
#define PB push_back
#define F first
#define S second
#define Task ""
using namespace std;
template <typename T > inline void MIN(T &a, T b) { if(a>b) a=b; }
template <typename T > inline void MAX(T &a, T b) { if(a<b) a=b; }
const int N=500005;
int n, a[N], Q, ans[N];
vector <pii > query[N];
vector <int > v[N];
stack <int > s;
struct node {
int ab, c, sum;
node(int AB=0, int C=0, int SUM=0) {
ab=AB, c=C, sum=SUM;
}
};
node Merge(node L, node R) {
return node(max(L.ab, R.ab), max(L.c, R.c), max(max(L.sum, R.sum), L.ab+R.c));
}
node t[N*4];
void updateC(int l, int r, int id, int pos) {
if(l==r) {
t[id].c=a[pos];
t[id].sum=a[pos];
return;
}
int mid=(r+l)>>1;
if(pos<=mid) updateC(l, mid, id*2, pos);
else updateC(mid+1, r, id*2+1, pos);
t[id]=Merge(t[id*2], t[id*2+1]);
}
void updateAB(int l, int r, int id, int pos, int val) {
if(l==r) {
t[id].ab=max(t[id].ab, val);
t[id].sum=t[id].ab+t[id].c;
return;
}
int mid=(r+l)>>1;
if(pos<=mid) updateAB(l, mid, id*2, pos, val);
else updateAB(mid+1, r, id*2+1, pos, val);
t[id]=Merge(t[id*2], t[id*2+1]);
}
node get(int l, int r, int id, int u, int v) {
if(r<u||v<l) return node();
if(u<=l&&r<=v) return t[id];
int mid=(r+l)>>1;
node L=get(l, mid, id*2, u, v);
node R=get(mid+1, r, id*2+1, u, v);
return Merge(L, R);
}
void setup() {
cin >> n;
rep(i, 1, n) cin >> a[i];
cin >> Q;
rep(i, 1, Q) {
int l, r; cin >> l >> r;
query[l].PB(mp(r, i));
}
}
void pre() {
rep(i, 1, n) {
while(!s.empty()&&a[i]>a[s.top()]) {
v[s.top()].PB(i);
s.pop();
}
if(s.size()) v[s.top()].PB(i);
s.push(i);
}
}
void calc() {
for(int i=n ; i ; --i) {
updateC(1, n, 1, i);
for(auto val:v[i]) if(2*val-i<=n) updateAB(1, n, 1, 2*val-i, a[i]+a[val]);
for(auto P:query[i]) {
ans[P.S]=get(1, n, 1, i, P.F).sum;
}
}
rep(i, 1, Q) cout << ans[i] << '\n';
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//freopen(Task".inp", "r", stdin);
//freopen(Task".out", "w", stdout);
setup();
pre();
calc();
return 0;
}
# | 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... |