#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
typedef vector<int> vi;
#define iii tuple<int,int,int>
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef map<int,int> mii;
#ifndef debug
#define cerr if (0) cerr
#endif
const int INF=1e17;
struct node {
int s, e;
int mn, mx, sum, add_val, set_val;
bool lset;
node *l, *r;
node (int _s, int _e, int A[] = NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) {
if (A == NULL) return;
if (s == e) mn = mx = sum = A[s];
else {
l = new node(s, (s+e)>>1, A), r = new node((s+e+2)>>1, e, A);
combine();
}
}
void create_children() {
if (s == e) return;
if (l != NULL) return;
int m = (s+e)>>1;
l = new node(s, m);
r = new node(m+1, e);
}
void self_set(int v) {
lset = 1;
mn = mx = set_val = v;
sum = v * (e-s+1);
add_val = 0;
}
void self_add(int v) {
if (lset) { self_set(v + set_val); return; }
mn += v, mx += v, add_val += v;
sum += v*(e-s+1);
}
void lazy_propagate() {
if (s == e) return;
if (lset) {
l->self_set(set_val), r->self_set(set_val);
lset = set_val = 0;
}
if (add_val != 0) {
l->self_add(add_val), r->self_add(add_val);
add_val = 0;
}
}
void combine() {
if (l == NULL) return;
sum = l->sum + r->sum;
mn = min(l->mn, r->mn);
mx = max(l->mx, r->mx);
}
#define UPDATE(name)\
void name(int x, int y, int v) { \
if (s == x && e == y) { self_##name(v); return; } \
int m = (s+e)>>1; \
create_children(); lazy_propagate(); \
if (x <= m) l->name(x, min(y, m), v); \
if (y > m) r->name(max(x, m+1), y, v); \
combine(); \
}
UPDATE(add) //generates add
UPDATE(set) //generates set
#define QUERY(name, fn, var, lazyfn)\
int range_##name(int x, int y) {\
if (s == x && e == y) return var; \
if (l == NULL || lset) return lazyfn(var);\
int m = (s+e)>>1; lazy_propagate(); \
if (y <= m) return l->range_##name(x, y); \
if (x > m) return r->range_##name(x, y); \
return fn(l->range_##name(x, m), r->range_##name(m+1, y)) ; \
}
#define SAME(var) (var)
#define PART(var) ((var) /(e-s+1) * (y-x+1))
#define SUM(a, b) ((a)+(b))
QUERY(min, min, mn, SAME) //generates range_min
QUERY(max, max, mx, SAME) //generates range_max
QUERY(sum, SUM, sum, PART) //generates range_sum
~node() {
if (l != NULL) delete l;
if (r != NULL) delete r;
}
} *root;
int N, Q, L, R, ans;
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>N; int A[N+5];
for (int i=1; i<=N; i++){
cin>>A[i];
}
root = new node(1, N+5, A);
cin>>Q;
while (Q--){
cin>>L>>R;
ans = 0;
for (int i=L; i<=R; i++){
for (int j=i+1; j<=R; j++){
/*for (int k=j+1; k<=R; k++){
if (!(j-i <= k-j)) continue;
ans=max(ans, A[i]+A[j]+A[k]);
}*/
//printf("P %lld %lld %lld %lld\n",i,j,2*j-i, R);
if (2*j-i>R) continue;
ans=max(ans, A[i]+A[j]+root->range_max(max(j+1,2*j-i), R));
//printf("A %lld\n", ans);
}
}
//printf("%lld\n", ans);
cout<<ans<<"\n";
}
}
Compilation message
jumps.cpp: In constructor 'node::node(long long int, long long int, long long int*)':
jumps.cpp:20:10: warning: 'node::lset' will be initialized after [-Wreorder]
20 | bool lset;
| ^~~~
jumps.cpp:19:22: warning: 'long long int node::add_val' [-Wreorder]
19 | int mn, mx, sum, add_val, set_val;
| ^~~~~~~
jumps.cpp:22:5: warning: when initialized here [-Wreorder]
22 | node (int _s, int _e, int A[] = NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) {
| ^~~~
jumps.cpp: In member function 'void node::lazy_propagate()':
jumps.cpp:52:28: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
52 | lset = set_val = 0;
| ~~~~~~~~^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
3 ms |
348 KB |
Output is correct |
3 |
Correct |
3 ms |
348 KB |
Output is correct |
4 |
Correct |
2 ms |
348 KB |
Output is correct |
5 |
Correct |
2 ms |
348 KB |
Output is correct |
6 |
Correct |
2 ms |
348 KB |
Output is correct |
7 |
Correct |
3 ms |
348 KB |
Output is correct |
8 |
Correct |
3 ms |
348 KB |
Output is correct |
9 |
Correct |
3 ms |
344 KB |
Output is correct |
10 |
Correct |
2 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
3 ms |
348 KB |
Output is correct |
3 |
Correct |
3 ms |
348 KB |
Output is correct |
4 |
Correct |
2 ms |
348 KB |
Output is correct |
5 |
Correct |
2 ms |
348 KB |
Output is correct |
6 |
Correct |
2 ms |
348 KB |
Output is correct |
7 |
Correct |
3 ms |
348 KB |
Output is correct |
8 |
Correct |
3 ms |
348 KB |
Output is correct |
9 |
Correct |
3 ms |
344 KB |
Output is correct |
10 |
Correct |
2 ms |
348 KB |
Output is correct |
11 |
Execution timed out |
4048 ms |
1372 KB |
Time limit exceeded |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
4053 ms |
39332 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
3 ms |
348 KB |
Output is correct |
3 |
Correct |
3 ms |
348 KB |
Output is correct |
4 |
Correct |
2 ms |
348 KB |
Output is correct |
5 |
Correct |
2 ms |
348 KB |
Output is correct |
6 |
Correct |
2 ms |
348 KB |
Output is correct |
7 |
Correct |
3 ms |
348 KB |
Output is correct |
8 |
Correct |
3 ms |
348 KB |
Output is correct |
9 |
Correct |
3 ms |
344 KB |
Output is correct |
10 |
Correct |
2 ms |
348 KB |
Output is correct |
11 |
Execution timed out |
4048 ms |
1372 KB |
Time limit exceeded |
12 |
Halted |
0 ms |
0 KB |
- |