Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.06 KB | None | 0 0
  1. class SparseTable {
  2. public:
  3. vector<int> e;
  4. vector<int> a;
  5. vector<int> logTable;
  6. vector<vector<int>> rmq;
  7. SparseTable(vector<int>& a1, vector<int>& e1) {
  8. a = a1;
  9. e = e1;
  10. int n = a.size();
  11. logTable.resize(n + 1);
  12.  
  13. for (int i = 2; i <= n; ++i) {
  14. logTable[i] = logTable[i >> 1] + 1;
  15. }
  16. rmq.resize(logTable[n] + 1);
  17. for (auto& i : rmq) {
  18. i.resize(n);
  19. }
  20. for (int i = 0; i < n; ++i) {
  21. rmq[0][i] = i;
  22. }
  23. for (int k = 1; (1 << k) < n; ++k) {
  24. for (int i = 0; i + (1 << k) < n + 1; ++i) {
  25. int x = rmq[k - 1][i];
  26. int y = rmq[k - 1][i + (1 << k - 1)];
  27. rmq[k][i] = a[x] <= a[y] ? x : y;
  28. }
  29. }
  30. }
  31. int get(int i, int j) {
  32. if (i > j) {
  33. swap(i, j);
  34. }
  35. int k = logTable[j - i];
  36. int x = rmq[k][i];
  37. int y = rmq[k][j - (1 << k) + 1];
  38. return a[x] < a[y] ? e[x] : e[y];
  39. }
  40. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement