You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| <= 10000 , 1 <= N <= 10000 ). A query is defined as follows: Query(x1,y1,x2,y2) = Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 <= j <= y2 and x1 <= x2 , y1 <= y2 }. Given M queries (1 <= M <= 10000), your program must output the results of these queries.
Input
The first line of the input consist of the number of tests cases <= 5. Each case consist of the integer N and the sequence A. Then the integer M. M lines follow, contains 4 numbers x1, y1, x2 y2.
Output
Your program should output the results of the M queries for each test case, one query per line.
Example
Input: 2 6 3 -2 1 -4 5 2 2 1 1 2 3 1 3 2 5 1 1 1 1 1 1 1 Output: 2 3 1
题意:
给定一个序列和m个询问, 每次询问左端点在[x1,y1],右端点在[x2,y2]的最大连续子段和。
思路:
还是用线段树跟GSS1差不多的搞,如果两个区间不相交的话,就求出[x1,y1]的右连续和[x2,y2]的左连续, 再加上中间的区间和。
如果相交的话, 需要求出[x2,y1]的最大连续子段和,[x2,y1]的左连续加上[y1+1,y2]的右连续,[x1,x2-1]的左连续加上[x2,y2]的右连续。