gt22

Untitled

Sep 13th, 2018
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.47 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. public class O1112_sparsetable {
  8.  
  9.  
  10.     public static void main(String[] args) throws IOException {
  11.         BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
  12.         int M = Integer.parseInt(r.readLine());
  13.         List<Integer> data = new ArrayList<>();
  14.         String s;
  15.         while(!(s = r.readLine()).equals("-1")) {
  16.             data.add(Integer.parseInt(s));
  17.         }
  18.         int[] d = new int[data.size()];
  19.         for (int i = 0; i < data.size(); i++) {
  20.             d[i] = data.get(i);
  21.         }
  22.         SparseTable table = new SparseTable(d);
  23.         for (int i = 0; i <= data.size() - M; i++) {
  24.             System.out.println(table.calc(i, i + M - 1));
  25.         }
  26.     }
  27.  
  28.  
  29.     static class SparseTable {
  30.  
  31.         final int[][] data;
  32.         final int[] lenToPOT;
  33.         final int size;
  34.         final int maxPOT;
  35.  
  36.         SparseTable(int size) {
  37.             data = new int[maxPOT = getPOT(size) + 1][this.size = size];
  38.             lenToPOT = new int[size + 1];
  39.             for (int i = 1; i <= size; i++) {
  40.                 lenToPOT[i] = getPOT(i);
  41.             }
  42.         }
  43.  
  44.         SparseTable(int[] orig) {
  45.             this(orig.length);
  46.             init(orig);
  47.         }
  48.  
  49.         private void init(int[] orig) {
  50.             System.arraycopy(orig, 0, data[0], 0, orig.length);
  51.             for (int i = 1; i <= maxPOT; i++) {
  52.                 int len = 1 << i;
  53.                 int end = size - len + 1;
  54.                 for (int j = 0; j < end; j++) {
  55.                     int left = data[i - 1][j];
  56.                     int right = data[i - 1][j + (len / 2)];
  57.                     data[i][j] = Math.max(left, right);
  58.                 }
  59.             }
  60.         }
  61.  
  62.  
  63.         int calc(int from, int to) {
  64.             int pot = lenToPOT[to - from + 1];
  65.             int[] locData = data[pot];
  66.             int len = 1 << pot;
  67.             int left = locData[from];
  68.             int right = locData[to - len + 1];
  69.             return Math.max(left, right);
  70.         }
  71.  
  72.  
  73.         private int getPOT(int num) {
  74.             if(num == 1) return 0;
  75.  
  76.             int pot = 0;
  77.             int i = 1;
  78.             while(true) {
  79.                 i *= 2;
  80.                 if(i >= num) {
  81.                     return pot;
  82.                 }
  83.                 pot++;
  84.             }
  85.         }
  86.  
  87.     }
  88.  
  89.  
  90.  
  91. }
Advertisement
Add Comment
Please, Sign In to add comment