import java.util.*;
public class Main {
static final Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
new SegmentTree(scan);
}
}
class SegmentTree{
private long[] max;
private long[] min;
private long[] data;
public SegmentTree(Scanner scan){
int n = scan.nextInt();
int q = scan.nextInt();
max = new long[4 * n];
min = new long[4 * n];
data = new long[n + 1];
//data[i]就表示到当前节点的前缀和
for (int i = 1; i <= n; i++) {
data[i] = data[i - 1] + scan.nextInt();
}
build(1, n, 1);
while(q-- > 0){
int a = scan.nextInt() - 1, b = scan.nextInt() - 1, c = scan.nextInt(), d = scan.nextInt();
long r = getMax(1, n, c, d, 1);
long l = getMin(1, n, a, b, 1);
System.out.println(r - l);
}
}
public void build(int s, int e, int p){
if(s == e){
max[p] = min[p] = data[s];
return;
}
int m = (s + e) >> 1;
build(s, m, 2 * p);
build(m + 1, e, 2 * p + 1);
max[p] = Math.max(max[2 * p], max[2 * p + 1]);
min[p] = Math.min(min[2 * p], min[2 * p + 1]);
}
//[s,e]是当前代表区间 , [l,r]是目标区间
public long getMax(int s, int e, int l, int r, int p){ //[s, e]找最大
if(s >= l && e <= r)
return max[p];
int mid = (s + e) >> 1;
long ans = Integer.MIN_VALUE;
if(l <= mid){
ans = Math.max(ans, getMax(s, mid, l, r, 2 * p));
}
if(r > mid){
ans = Math.max(ans, getMax(mid + 1, e, l, r, 2 * p + 1));
}
return ans;
}
//找最小
public long getMin(int s, int e, int l, int r, int p){
if(s >= l && e <= r)
return min[p];
int mid = (s + e) >> 1;
long ans = Integer.MAX_VALUE;
if(l <= mid)
ans = Math.min(ans, getMin(s, mid, l, r, 2 * p));
if(r > mid)
ans = Math.min(ans, getMin(mid + 1, e, l, r, 2 * p + 1));
return ans;
}
}
求大佬看看6.29蓝桥季度赛5题代码哪里有bu
最新推荐文章于 2024-10-14 09:08:48 发布