Advertisement
skimono

SegmentTree

May 10th, 2023
765
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  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 SegTree {
  14.     vector <Node> t;
  15.     int n;
  16.     SegTree(vector <int>& a) {
  17.         n = (int)a.size() * 4;
  18.         t.resize(n);
  19.         build(1, 0, (int)a.size() - 1, a);
  20.     }
  21.     void unite(const Node& l, const Node& r, Node& m) {
  22.         if (l.mx > r.mx) {
  23.             m = l;
  24.         }
  25.         else {
  26.             m = r;
  27.         }
  28.     }
  29.     void build(int v, int l, int r, vector <int>& a) {
  30.         if (l == r) {
  31.             t[v].mx = a[l];
  32.             t[v].id = l;
  33.         }
  34.         else {
  35.             int m = (l + r) / 2;
  36.             build(2 * v, l, m, a);
  37.             build(2 * v + 1, m + 1, r, a);
  38.             unite(t[2 * v], t[2 * v + 1], t[v]);
  39.         }
  40.     }
  41.     Node query(int v, int l, int r, int ql, int qr) {
  42.         if (qr < l || ql > r) {
  43.             return { -inf, -1 };
  44.         }
  45.         else if (ql <= l && qr >= r) {
  46.             return t[v];
  47.         }
  48.         else {
  49.             int m = (l + r) / 2;
  50.             Node L = query(2 * v, l, m, ql, qr), R = query(2 * v + 1, m + 1, r, ql, qr), M;
  51.             unite(L, R, M);
  52.             return M;
  53.         }
  54.     }
  55.     void update(int v, int l, int r, int idx, int x) {
  56.         if (idx < l || idx > r) {
  57.             return;
  58.         }
  59.         else if (idx <= l && idx >= r) {
  60.             t[v].mx = x;
  61.         }
  62.         else {
  63.             int m = (l + r) / 2;
  64.             update(2 * v, l, m, idx, x);
  65.             update(2 * v + 1, m + 1, r, idx, x);
  66.             unite(t[2 * v], t[2 * v + 1], t[v]);
  67.         }
  68.     }
  69. };
  70.  
  71. int main() {
  72.     int n;
  73.     cin >> n;
  74.     vector <int> a(n);
  75.     for (int i = 0; i < n; i++) {
  76.         cin >> a[i];
  77.     }
  78.     SegTree tree(a);
  79.     Node res;
  80.     int k;
  81.     cin >> k;
  82.     for (int i = 0; i < k; i++) {
  83.         int l, r;
  84.         cin >> l >> r;
  85.         res = tree.query(1, 0, n - 1, l - 1, r - 1);
  86.         cout << res.mx << " " << res.id + 1 << '\n';
  87.     }
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement