Advertisement
skimono

SparceTable

May 10th, 2023
860
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. const int inf = 1e9 + 7;
  8.  
  9. struct Node {
  10.     int mx = -inf, id = -1;
  11. };
  12.  
  13. struct Sparce {
  14.     vector<int> lg;
  15.     vector<vector<Node>> sp;
  16.     int k, n;
  17.     void build(int _n, int _k, vector<int>& a) {
  18.         k = _k;
  19.         n = _n;
  20.         lg.resize(1 << k, 0);
  21.         sp.resize(k, vector<Node>(n));
  22.         for (int i = 0; i < n; i++) {
  23.             sp[0][i] = { a[i], i };
  24.         }
  25.         for (int i = 2; i < lg.size(); i++) {
  26.             lg[i] = lg[i / 2] + 1;
  27.         }
  28.         for (int j = 1; j < k; j++) {
  29.             for (int i = 0; i + (1 << (j - 1)) < n; i++) {
  30.                 unite(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))], sp[j][i]);
  31.             }
  32.         }
  33.     }
  34.  
  35.     void unite(const Node& l, const Node& r, Node& m) {
  36.         if (l.mx > r.mx) {
  37.             m = l;
  38.         }
  39.         else {
  40.             m = r;
  41.         }
  42.     }
  43.  
  44.     void get(int l, int r, Node& res) {
  45.         int lgs = lg[r - l + 1];
  46.         unite(sp[lgs][l], sp[lgs][max(0, r - (1 << lgs) + 1)], res);
  47.         return;
  48.     }
  49. };
  50.  
  51. int main() {
  52.     int n, i, k, l, r;
  53.     cin >> n;
  54.     Node res;
  55.     vector <int> a(n);
  56.     for (i = 0; i < n; i++) {
  57.         cin >> a[i];
  58.     }
  59.     Sparce Q;
  60.     Q.build(n, (int)ceil(log2(n)) + 1, a);
  61.     cin >> k;
  62.     for (i = 0; i < k; i++) {
  63.         cin >> l >> r;
  64.         Q.get(l - 1, r - 1, res);
  65.         cout << res.mx << " " << res.id + 1 << "\n";
  66.     }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement