Guest User

GSS1

a guest
May 3rd, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.47 KB | None | 0 0
  1. import java.io.DataInputStream;
  2. import java.io.IOException;
  3.  
  4. import static java.lang.Integer.MIN_VALUE;
  5. import static java.lang.Integer.max;
  6.  
  7. class GSS1 {
  8.  
  9.     private static final int MAX_SUM =0,SUM=1, MAX_PREFIX =2, MAX_SUFFIX = 3;
  10.  
  11.     private static int tree[][] = new int[200010][4];
  12.  
  13.     private static int minResult[] = new int[]{MIN_VALUE, MIN_VALUE, MIN_VALUE, MIN_VALUE};
  14.  
  15.     private static int a[] = new int[50001];
  16.  
  17.     public static void main(String[] args) throws IOException {
  18.         Reader fr = new Reader();
  19.         int n, m, l, r;
  20.         n = fr.nextInt();
  21.         for (int i = 0; i < n; i++) {
  22.             a[i] = fr.nextInt();
  23.         }
  24.         buildTree(1, 0, n);
  25.         m = fr.nextInt();
  26.         for (int i = 0; i < m; i++) {
  27.             // [l,r)
  28.             l = fr.nextInt() - 1;
  29.             r = fr.nextInt();
  30.             System.out.println(query(1, 0, n, l, r)[MAX_SUM]);
  31.         }
  32.     }
  33.  
  34.     private static int[] query(int id, int start, int end, int l, int r) {
  35.  
  36.         if (end <= l || start >= r) {
  37.             return minResult;
  38.         }
  39.  
  40.         if (start >= l && end <= r) {
  41.             return tree[id];
  42.         }
  43.  
  44.         int mid = (start + end) / 2;
  45.         int lc = id << 1;         //left child node
  46.         int rc = (id << 1) + 1;  //right child node
  47.  
  48.         int left[] = query(lc, start, mid, l, r);
  49.         int right[] = query(rc, mid, end, l, r);
  50.  
  51.         int maxSum, sum, maxPrefix, maxSuffix;
  52.  
  53.  
  54.         maxSum = max(max(left[MAX_SUM], right[MAX_SUM]),
  55.                 left[MAX_SUFFIX] + right[MAX_PREFIX]);
  56.  
  57.         sum = left[SUM] + right[SUM];
  58.         maxPrefix = max(left[MAX_PREFIX], left[SUM] + right[MAX_SUFFIX]);
  59.         maxSuffix = max(right[MAX_SUFFIX], right[SUM] + left[MAX_SUFFIX]);
  60.  
  61.         return new int[]{maxSum, sum, maxPrefix, maxSuffix};
  62.     }
  63.  
  64.     private static void buildTree(int id, int l, int r) {
  65.         if (r - l < 2) {
  66.             tree[id][MAX_SUM] = a[l];
  67.             tree[id][SUM] = a[l];
  68.             tree[id][MAX_PREFIX] = a[l];
  69.             tree[id][MAX_SUFFIX] = a[l];
  70.             return;
  71.         }
  72.         int mid = (l + r) / 2;
  73.         int left = id << 1;
  74.         int right = (id << 1) + 1;
  75.         buildTree(left, l, mid);
  76.         buildTree(right, mid, r);
  77.         tree[id][MAX_SUM] = max(max(tree[left][MAX_SUM], tree[right][MAX_SUM]),
  78.                                 tree[left][MAX_SUFFIX] + tree[right][MAX_PREFIX]);
  79.         tree[id][SUM] = tree[left][SUM] + tree[right][SUM];
  80.         tree[id][MAX_PREFIX] = max(tree[left][MAX_PREFIX], tree[left][SUM] + tree[right][MAX_SUFFIX]);
  81.         tree[id][MAX_SUFFIX] = max(tree[right][MAX_SUFFIX], tree[right][SUM] + tree[left][MAX_SUFFIX]);
  82.     }
  83.  
  84.     static class Reader {
  85.         final private int BUFFER_SIZE = 1 << 16;
  86.         private DataInputStream din;
  87.         private byte[] buffer;
  88.         private int bufferPointer, bytesRead;
  89.  
  90.         public Reader()
  91.         {
  92.             din = new DataInputStream(System.in);
  93.             buffer = new byte[BUFFER_SIZE];
  94.             bufferPointer = bytesRead = 0;
  95.         }
  96.  
  97.         public String readLine() throws IOException
  98.         {
  99.             byte[] buf = new byte[64]; // line length
  100.             int cnt = 0, c;
  101.             while ((c = read()) != -1)
  102.             {
  103.                 if (c == '\n')
  104.                     break;
  105.                 buf[cnt++] = (byte) c;
  106.             }
  107.             return new String(buf, 0, cnt);
  108.         }
  109.  
  110.         public int nextInt() throws IOException
  111.         {
  112.             int ret = 0;
  113.             byte c = read();
  114.             while (c <= ' ')
  115.                 c = read();
  116.             boolean neg = (c == '-');
  117.             if (neg)
  118.                 c = read();
  119.             do
  120.             {
  121.                 ret = ret * 10 + c - '0';
  122.             }  while ((c = read()) >= '0' && c <= '9');
  123.  
  124.             if (neg)
  125.                 return -ret;
  126.             return ret;
  127.         }
  128.  
  129.  
  130.         private void fillBuffer() throws IOException
  131.         {
  132.             bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
  133.             if (bytesRead == -1)
  134.                 buffer[0] = -1;
  135.         }
  136.  
  137.         private byte read() throws IOException
  138.         {
  139.             if (bufferPointer == bytesRead)
  140.                 fillBuffer();
  141.             return buffer[bufferPointer++];
  142.         }
  143.  
  144.         public void close() throws IOException
  145.         {
  146.             if (din == null)
  147.                 return;
  148.             din.close();
  149.         }
  150.     }
  151. }
Add Comment
Please, Sign In to add comment