Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.DataInputStream;
- import java.io.IOException;
- import static java.lang.Integer.MIN_VALUE;
- import static java.lang.Integer.max;
- class GSS1 {
- private static final int MAX_SUM =0,SUM=1, MAX_PREFIX =2, MAX_SUFFIX = 3;
- private static int tree[][] = new int[200010][4];
- private static int minResult[] = new int[]{MIN_VALUE, MIN_VALUE, MIN_VALUE, MIN_VALUE};
- private static int a[] = new int[50001];
- public static void main(String[] args) throws IOException {
- Reader fr = new Reader();
- int n, m, l, r;
- n = fr.nextInt();
- for (int i = 0; i < n; i++) {
- a[i] = fr.nextInt();
- }
- buildTree(1, 0, n);
- m = fr.nextInt();
- for (int i = 0; i < m; i++) {
- // [l,r)
- l = fr.nextInt() - 1;
- r = fr.nextInt();
- System.out.println(query(1, 0, n, l, r)[MAX_SUM]);
- }
- }
- private static int[] query(int id, int start, int end, int l, int r) {
- if (end <= l || start >= r) {
- return minResult;
- }
- if (start >= l && end <= r) {
- return tree[id];
- }
- int mid = (start + end) / 2;
- int lc = id << 1; //left child node
- int rc = (id << 1) + 1; //right child node
- int left[] = query(lc, start, mid, l, r);
- int right[] = query(rc, mid, end, l, r);
- int maxSum, sum, maxPrefix, maxSuffix;
- maxSum = max(max(left[MAX_SUM], right[MAX_SUM]),
- left[MAX_SUFFIX] + right[MAX_PREFIX]);
- sum = left[SUM] + right[SUM];
- maxPrefix = max(left[MAX_PREFIX], left[SUM] + right[MAX_SUFFIX]);
- maxSuffix = max(right[MAX_SUFFIX], right[SUM] + left[MAX_SUFFIX]);
- return new int[]{maxSum, sum, maxPrefix, maxSuffix};
- }
- private static void buildTree(int id, int l, int r) {
- if (r - l < 2) {
- tree[id][MAX_SUM] = a[l];
- tree[id][SUM] = a[l];
- tree[id][MAX_PREFIX] = a[l];
- tree[id][MAX_SUFFIX] = a[l];
- return;
- }
- int mid = (l + r) / 2;
- int left = id << 1;
- int right = (id << 1) + 1;
- buildTree(left, l, mid);
- buildTree(right, mid, r);
- tree[id][MAX_SUM] = max(max(tree[left][MAX_SUM], tree[right][MAX_SUM]),
- tree[left][MAX_SUFFIX] + tree[right][MAX_PREFIX]);
- tree[id][SUM] = tree[left][SUM] + tree[right][SUM];
- tree[id][MAX_PREFIX] = max(tree[left][MAX_PREFIX], tree[left][SUM] + tree[right][MAX_SUFFIX]);
- tree[id][MAX_SUFFIX] = max(tree[right][MAX_SUFFIX], tree[right][SUM] + tree[left][MAX_SUFFIX]);
- }
- static class Reader {
- final private int BUFFER_SIZE = 1 << 16;
- private DataInputStream din;
- private byte[] buffer;
- private int bufferPointer, bytesRead;
- public Reader()
- {
- din = new DataInputStream(System.in);
- buffer = new byte[BUFFER_SIZE];
- bufferPointer = bytesRead = 0;
- }
- public String readLine() throws IOException
- {
- byte[] buf = new byte[64]; // line length
- int cnt = 0, c;
- while ((c = read()) != -1)
- {
- if (c == '\n')
- break;
- buf[cnt++] = (byte) c;
- }
- return new String(buf, 0, cnt);
- }
- public int nextInt() throws IOException
- {
- int ret = 0;
- byte c = read();
- while (c <= ' ')
- c = read();
- boolean neg = (c == '-');
- if (neg)
- c = read();
- do
- {
- ret = ret * 10 + c - '0';
- } while ((c = read()) >= '0' && c <= '9');
- if (neg)
- return -ret;
- return ret;
- }
- private void fillBuffer() throws IOException
- {
- bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
- if (bytesRead == -1)
- buffer[0] = -1;
- }
- private byte read() throws IOException
- {
- if (bufferPointer == bytesRead)
- fillBuffer();
- return buffer[bufferPointer++];
- }
- public void close() throws IOException
- {
- if (din == null)
- return;
- din.close();
- }
- }
- }
Add Comment
Please, Sign In to add comment