hxrussia

Sparse Table

Mar 28th, 2014
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.95 KB | None | 0 0
  1. template< class Data, Data (*oper)(Data, Data) >
  2. class SparseTable {
  3.     Data **table; // [power][begin]
  4.     int *powers;
  5. public:
  6.     SparseTable(Data *array, int len) {
  7.         powers = new int [len + 1];
  8.         int pow = 0;
  9.         for (int i = 1; i <= len; i++) {
  10.             if ((1 << (pow + 1)) <= i)
  11.                 pow++;
  12.             powers[i] = pow;
  13.         }
  14.        
  15.         table = new Data *[++pow];
  16.         table[0] = array;
  17.         for (int cur_pow = 1; cur_pow < pow; cur_pow++) {
  18.             int max_begin = len - (1 << cur_pow) + 1;
  19.             table[cur_pow] = new Data [max_begin];
  20.             for (int i = 0; i < max_begin; i++)
  21.                 table[cur_pow][i] = oper(table[cur_pow - 1][i],
  22.                         table[cur_pow - 1][i + (1 << (cur_pow - 1))]);
  23.         }
  24.     }
  25.    
  26.     Data get(int l, int r) {
  27.         int pow = powers[r - l + 1];
  28.         return oper(table[pow][l], table[pow][r - (1 << pow) + 1]);
  29.     }
  30. };
Advertisement
Add Comment
Please, Sign In to add comment