-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathCanYouAnswerQueries1.cpp
More file actions
81 lines (73 loc) · 2.07 KB
/
Copy pathCanYouAnswerQueries1.cpp
File metadata and controls
81 lines (73 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cstdio>
#include <unistd.h>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define SIZE 50000
struct Node {
long long sum, maxSum, prefixSum, suffixSum;
};
class SegmentTree {
Node tree[4*SIZE];
long long parents[SIZE];
vector<long long> elements;
long long size;
Node mergeNodes(Node a, Node b) {
Node res;
res.sum = a.sum + b.sum;
res.maxSum = std::max(std::max(a.maxSum, b.maxSum), (a.suffixSum + b.prefixSum));
res.prefixSum = std::max(a.prefixSum, a.sum + b.prefixSum);
res.suffixSum = std::max(b.suffixSum, b.sum + a.suffixSum);
return res;
}
public:
SegmentTree(vector<long long> arr) : size(arr.size()) {
elements = arr;
buildTree(0, 0, size-1);
}
void buildTree(long long curNode, long long start, long long end) {
if(start == end) {
tree[curNode].prefixSum = tree[curNode].suffixSum = tree[curNode].sum = tree[curNode].maxSum = elements[start];
parents[start] = curNode;
}
else {
long long l = curNode * 2 + 1;
long long r = curNode * 2 + 2;
long long mid = (start + end)/2;
buildTree(l, start, mid);
buildTree(r, mid+1, end);
tree[curNode] = mergeNodes(tree[l], tree[r]);
}
}
Node query(long long curNode, long long start, long long end, long long qx, long long qy) {
if(qx == start && end == qy) {
return tree[curNode];
}
long long l = curNode * 2 + 1;
long long r = curNode * 2 + 2;
long long mid = (start+end)/2;
if(qy <= mid)
return query(l, start, mid, qx, qy);
else if(qx > mid)
return query(r, mid+1, end, qx, qy);
else {
return mergeNodes(query(l, start, mid, qx, mid), query(r, mid+1, end, mid+1, qy));
}
}
};
int main() {
long long N, Q;
scanf("%lld", &N);
vector<long long> arr(N);
for(long long i = 0; i < N; i++)
scanf("%lld", &arr[i]);
scanf("%lld", &Q);
SegmentTree ss(arr);
for(long long i = 0; i < Q; i++) {
long long a, b;
scanf("%lld%lld", &a, &b);
printf("%lld\n", ss.query(0, 0, N-1, a-1, b-1).maxSum);
}
return 0;
}